从数组中选择随机字符串,除非它等于

时间:2016-06-30 14:41:40

标签: php arrays random

我在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>';
}

我需要确保相同的颜色不会在彼此旁边使用。

由于

2 个答案:

答案 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>';
}