2016-06-30 116 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>'; 
}