2016-06-30 21 views
-2

我在foreach循環中選取一個隨機顏色,我如何確保所選顏色不是選定的最後一種顏色?從數組中選擇隨機字符串,除非它等於

這是我當前的代碼示例:

$array = array('a', 'b', 'c', 'd', 'e'); 
$colors = array('#61AE24', '#EAE672', '#00A1CB', '#E54028', '#E59B28', '#28E4E5', '#DB28E5'); 
foreach($array as $val) { 
    $color = $colors[array_rand($colors)]; 
    echo '<div style="color: '.$color.';">'.$val.'</div>'; 
} 

我需要確保未來用於海誓山盟相同顏色的心不是。

感謝

+0

所以你只是想,你不能在一排接一值的兩倍? – Rizier123

+0

是的,很好解釋! – Kobi

+0

然後你可能想要使用'$ _SESSION'數組,如果你想通過多個請求來做到這一點。 – Rizier123

回答

1

你沒有采摘在每次迭代中隨機顏色,你實際上已經把它的循環之外。我已經將它移到了你的循環中。

$array = array('a', 'b', 'c', 'd', 'e'); 
$colors = array('#61AE24', '#EAE672', '#00A1CB', '#E54028', '#E59B28', '#28E4E5', '#DB28E5'); 
$lastcolor = NULL; 
foreach($array as $val) { 
    while (empty($color) || $color == $lastcolor) { 
     $color = $colors[array_rand($colors)]; 
    } 
    $lastcolor = $color; 
    echo '<div style="color: '.$color.';">'.$val.'</div>'; 
} 

有幾件事情需要注意:

  • $lastcolor是在循環外部定義,因此它迭代之間仍然存在
  • 我們設置了$color,那麼$color是對$lastcolor檢查,分配新隨機顏色,直到他們不匹配
  • 最後,$lastcolor設置爲您的新顏色爲下一次迭代檢查

另一替代解決方案是從$colors在臨時數組中刪除最後的顏色:

$array = array('a', 'b', 'c', 'd', 'e'); 
$colors = array('#61AE24', '#EAE672', '#00A1CB', '#E54028', '#E59B28', '#28E4E5', '#DB28E5'); 
$lastcolor = NULL; 
foreach($array as $val) { 
    $temp_colors = $colors; 
    if (($key = array_search($lastcolor, $temp_colors)) !== false) { 
     unset($temp_colors[$key]); 
    } 
    $color = $temp_colors[array_rand($temp_colors)]; 
    $lastcolor = $color; 
    echo '<div style="color: '.$color.';">'.$val.'</div>'; 
} 

第一個解決方案是更可能具有更好的性能,假定在while循環迭代的次數不超過$colors中的元素數量。

+0

我喜歡你的第一個解決方案,它工作的很棒,簡單而有效! – Kobi

+0

當然你可以做'foreach($ array as $ val){shuffle($ colors); $ color = array_shift($ colors); }'?假設你不需要在腳本的其他地方重複使用'$ colors' –

+0

@BenSwinburne我認爲'$ array'可以具有比'$ colors'更多的元素,否則確定 – sjagr

0

您可以使用array_filter的顏色過濾掉:

<?php 
$array = array('a', 'b', 'c', 'd', 'e'); 
$colors = array('#61AE24', '#EAE672', '#00A1CB', '#E54028', '#E59B28', '#28E4E5', '#DB28E5'); 
$color = ""; 
foreach($array as $val) 
{ 
    $filteredColors = array_filter($colors, function($v) { global $color; return $v != $color; }); 
    $color = $filteredColors[array_rand($filteredColors)]; 
    echo '<div style="color: '.$color.';">'.$val.'</div>'; 
}