2016-09-16 59 views
3

我有一個循環滑塊(最後一個元素後面跟着第一個元素)並且想要設置不同的顏色(基於3種顏色的範圍)。如何獲取最後一個元素既不是前一個元素又不是第一個元素的數組?

所以有兩個條件:以前的顏色和下一個顏色不能相同AND幻燈片數量(陣列中的元素)可能會有所不同。

很好的例子:

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中有1個機會(其中N是顏色的數量)。但它是簡單的工作出來的時候是這樣的話:

M % N = 1 

所以只要M%N不是一個它是你不必擔心的一個問題。當M%N爲1時,您只需要擔心改變的第一張或最後一張幻燈片的顏色。爲了爭論,我們將改變最後一個的顏色。

因此,只留下選擇哪種顏色的問題。

如果沒有更改,最後一張幻燈片將與第一張幻燈片的顏色相同,並且我們無法將其更改爲週期中的較早顏色,因爲這會使其與倒數第二張幻燈片的顏色相同。

Joeroen的解決方案相當混亂 - 搜索前一張或後一張幻燈片中未使用的顏色並應用該顏色。它使用的代碼比必要的更多。你只需在列表中選擇第二種顏色。

然而jeroen在說這個問題可以用2種顏色(或更少!)解決是錯誤的。代碼沒有量會幫助,如果只有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]; 
} 

這符合你的兩個條件。但現在你可能會告訴我第三個,因爲它不會那麼容易:-)

相關問題