我在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 :(得分: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
中的元素数量,第一种解决方案更有可能获得更好的性能。
答案 1 :(得分: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>';
}