我有一个这样的数组:
$arr = ['red' => '#110000', 'blue' => '000011', 'brown' => '#A52A2A', 'maroon' => '#800000'];
我需要将数组放在shuffle之上。有一个名为shuffle()
的php函数就是为了这个。但遗憾的是它删除了数组的键。这是fiddle。
无论如何,我怎样才能将数组洗牌并保留密钥?
答案 0 :(得分:4)
尝试此功能
function shuffle_assoc($array) {
$keys = array_keys($array);
shuffle($keys);
foreach($keys as $key) {
$new[$key] = $array[$key];
}
return $new;
}
答案 1 :(得分:1)
这是一个基于随机排序的解决方案,它保留了键值关联,如下所示:
<?php
$colors = ['red' => '#110000', 'blue' => '000011', 'brown' => '#A52A2A', 'maroon' => '#800000'];
function assoc_shuffle ( $arr ) {
uasort($arr, function ($a, $b) {
return rand(-1, 1);
});
return $arr;
}
print_r( assoc_shuffle( $colors ) );
请参阅demo
还有另一种方法可以保留键值关联,并允许使用shuffle()。该解决方案需要创建一个索引数组,以便每个元素都包含一个元素的数组,其元素和值与原始数组$ colors中的相同,如下所示:
<?php
function test_print($item, $key) {
echo "$key: $item\n";
}
$arr = array();
$colors = ['red' => '#110000', 'blue' => '000011', 'brown' => '#A52A2A', 'maroon' => '#800000'];
foreach ($colors as $k => $v ) {
$arr[] = [$k => $v];
}
shuffle( $arr );
array_walk_recursive($arr, 'test_print');
请参阅demo
答案 2 :(得分:1)
您可以使用array_multisort
:
function shuffle_assoc(array &$array)
{
$range = range(1, count($array));
shuffle($range);
array_multisort($range, $array);
}
这是working demo。
答案 3 :(得分:0)
喜欢这个;
$keys = array_keys($arr);
$values = shuffle(array_values($arr));
$shuffled = array_combine($keys, $values);