2016-09-16 12 views
3

У меня есть ползунок с петлей (последний элемент сопровождается первым элементом) и хотите установить другой цвет (в зависимости от диапазона 3 цвета).Как получить массив, в котором последний элемент не является ни предыдущим, ни первым элементом?

Таким образом, существует 2 условия: предыдущий цвет и следующий цвет не должны быть одинаковыми И количество слайдов (элементов в массиве) может отличаться.

Хороший пример:

Array 
(
    [0] => yellow 
    [1] => blue 
    [2] => red 
    [3] => yellow 
    [4] => red 
) 

Дурной пример (потому что элементы 0 и 4 имеют тот же цвет):

Array 
(
    [0] => yellow 
    [1] => blue 
    [2] => yellow 
    [3] => red 
    [4] => yellow 
) 

Другой плохой пример с большим количеством элементов (так как элементы 2 и 3 являются одинаковыми цвет):

Array 
(
    [0] => yellow 
    [1] => blue 
    [2] => red 
    [3] => red 
    [4] => blue 
    [5] => yellow 
    [6] => blue 
) 

Это то, что я пытаюсь, но я не думаю, что это хороший способ:

$i = 0; 
$bgcolors = array(); 
foreach($slides as $slide) { 
    switch ($i % 3) { 
     case 0: 
      $bgcolors[] = 'yellow'; 
      break; 
     case 1: 
      $bgcolors[] = 'blue'; 
      break; 
     case 2: 
      $bgcolors[] = 'red'; 
      break; 
    } 

    if ((count($slides) - $i) % 3 == 0) $i = 0; 

    $i++; 
} 
+0

Для первого (хорошего) примера это должен быть синий цвет справа? или вам нужен весь цвет, который находится между двумя разными цветами? –

+0

@HareshVidja Да, это так. Поскольку предыдущий цвет красный, а следующий цвет - желтый, синий - единственный вариант в этом случае. – Dacobah

+0

вам нужен массив или несколько цветов только первый цвет, который удовлетворяет вашему состоянию? –

ответ

1

, но я не думаю, что это хороший способ

Это относительно элегантный и эффективный способ гарантировать, что у вас нет последовательных совпадающих цветов за один проход по результатам. Но он может быть более изящным, используя метод, предложенный jeroen.

Однако он не решает проблему, когда список обтекает. Очевидно, что с неизвестным количеством слайдов (M) существует вероятность 1 в N (где N - количество цветов), чтобы первый слайд был выделен того же цвета, что и последний. Но это просто работать, когда это так:

M % N = 1 

Так что, пока M% N не один, это проблема, которую вы не должны беспокоиться.Когда M% N равно 1, вам нужно только беспокоиться о том, чтобы изменить цвет либо первый, либо последний слайд. Для аргумента мы изменим цвет последнего.

Для того, чтобы просто оставить проблему, какой цвет выбрать.

В отсутствие изменения последний слайд будет того же цвета, что и первый, и мы не можем изменить его на цвет ранее в цикле, поскольку это сделает его таким же, как предпоследний слайд.

Решение Joeroen довольно грязно - найдите цвет, не использованный в предыдущих или более поздних слайдах, и примените это. Он использует больше кода, чем необходимо. Вы просто выбираете второй цвет в списке.

Однако, джефер ошибается в том, что проблема может быть решена с помощью двух цветов (или меньше!). Никакое количество кода не поможет, если только 2 цвета и нечетное количество слайдов больше, чем 1.

отсюда:

$colors = ['yellow', 'blue', 'red']; 
    if (count($slides)>count($colors) && 3>count($colors)) { 
     trigger_error("unsolvable"); 
    } 
    $i = 0; 
    $bgcolors = array(); 
    foreach($slides as $slide) { 
    $bgcolors[] = $colors[$i % count($colours)]; 
    $i++; 
    } 
    if (1 < count($slides) && 1 == count($slides) % count($colors)) { 
    $bgcolors[count($slides)-1]=$colors[1]; 
    } 
+0

Последнюю часть непросто понять. Но, кажется, это правильный путь. –

+0

Я определенно не говорю, что это может быть разрешено во всех случаях; дополнительные проверки просто необходимы, чтобы не попасть в бесконечный цикл. Но, да, вы можете решить это более элегантно, используя простую математику :-) – jeroen

0

Предполагая, что цвета могут быть случайными (для указанных ограничений, кроме, конечно):

$slides = array('slide1', 'slide2', 'slide3', 'slide4', 'slide5'); 
$colors = array('red', 'blue', 'yellow'); 
$bg_colors = array(); 

foreach ($slides as $key=>$value) { 
    if ($key == 0) { // First slide 
     $bg_colors[] = $colors[mt_rand(0, 2)]; // Get random color 
    } else { // Other slides 
     $usable_colors = $colors; // Duplicate colors array 
     $usable_colors = array_values(array_diff($usable_colors, array($bg_colors[$key-1]))); // Remove last used color and reset keys 
     if ($key == count($slides) -1) { // Last slide 
      $usable_colors = array_values(array_diff($usable_colors, array($bg_colors[0]))); // Remove first used color and reset keys 
     } 
     $bg_colors[] = $usable_colors[mt_rand(0, count($usable_colors)-1)]; // Get random color 
    } 
} 
1

Вы должны начать с проставления своих цветов в массиве.

Затем, в конце массива, вам необходимо добавить логику, чтобы убедиться, что ни предыдущая, ни используется первый цвет:

$colors = ['yellow', 'blue', 'red']; 
$i = 0; 
$bgcolors = array(); 
foreach($slides as $slide) { 
    $bgcolors[] = $colors[$i % 3]; 

    $i++; 

    if ($slide == end($slides) { 
     $j = $i; 
     while ($bgcolors[$i - 1] === $colors[$j % 3] || $bgcolors[0] === $colors[$j % 3]) { 
      $j++; 
     } 
     $bgcolors[] = $colors[$j % 3]; 
    } 
} 

Обратите внимание, что вам нужно добавить условия, если цвет или слайдер массив может иметь 2 элемента или меньше ...

-1

Как я понимаю ваш вопрос, вот решение

$i = 0; 
$bgcolors = array(); 
foreach($slides as $slide) { 
if ($i > 2) $i = 0; 
switch ($i) { 
    case 0: 
     $bgcolors[] = 'yellow'; 
     break; 
    case 1: 
     $bgcolors[] = 'blue'; 
     break; 
    case 2: 
     $bgcolors[] = 'red'; 
     break; 
} 

$i++; 
} 
0

чистый способ сделать это, чтобы попросить все возможные цветы различных от последнего и первого в ползунке, а затем подбирать один случайным образом.

function getColorsForElements($numbersOfElements) { 

$colors_array = array('red', 'blue', 'yellow'); 
$bg_colors = array(); 

for ($i = 0; $i < $numbersOfElements; $i++) { 
    if ($i == $numbersOfElements - 1) 
     $first_color = reset($bg_colors); 
    else 
     $first_color = false; 

    $last_color  = end($bg_colors); 

    $possible_colors = array_diff($colors_array, array($first_color, $last_color)); 

    $index = array_rand($possible_colors, 1); 
    array_push($bg_colors, $possible_colors[$index]); 
} 

return $bg_colors; 
} 

Пример использования является getColorsForElements(5), что дает в результате:

Array 
(
    [0] => yellow 
    [1] => blue 
    [2] => red 
    [3] => blue 
    [4] => red 
) 
+0

Не чистый раствор - грубая сила – symcbean

+0

@symcbean Почему? –

0
$colors = ['yellow', 'blue', 'red']; 
$bgcolors = array($colors[2]); 
for ($i = 1; $i < count($slides); ++$i) { 
    $bgcolors[] = $colors[$i%2]; 
} 

Это соответствует вашим двум условиям. Но теперь вы, вероятно, скажете мне третий, потому что это не может быть так просто :-)