如何混合数组的项目?

时间:2017-04-30 06:24:16

标签: php arrays

我有一个这样的数组:

$arr = ['red' => '#110000', 'blue' => '000011', 'brown' => '#A52A2A', 'maroon' => '#800000'];

我需要将数组放在shuffle之上。有一个名为shuffle()的php函数就是为了这个。但遗憾的是它删除了数组的键。这是fiddle

无论如何,我怎样才能将数组洗牌并保留密钥?

4 个答案:

答案 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);