在PHP中改组数组的第一级

时间:2014-02-13 15:20:15

标签: php arrays

PHP的shuffle()不是按照我需要的方式随机化数组。我有一个二维数组,当我在它上面使用shuffle()时,它只是随机化数组的第二维,但我需要相反的。

让我们假设这是我需要改组的数组:

Array
(
    [0] => Array
        (
            [key1] => 199
            [key2] => 6
        )

    [1] => Array
        (
            [key1] => 195
            [key2] => 3
        )

)

shuffle()改变它的方式是这样的:

Array
(
    [0] => Array
        (
            [key1] => 195
            [key2] => 3
        )

    [1] => Array
        (
            [key1] => 199
            [key2] => 6
        )

)

但这不是我追求的。我最终需要的是:

Array
(
    [1] => Array
        (
            [key1] => 195
            [key2] => 6
        )

    [0] => Array
        (
            [key1] => 199
            [key2] => 6
        )

)

我知道这可以通过rand()mt_rand()使用随机密钥来实现,但也可能对于少量密钥,我们可以收到相同的{{1密钥两次,导致没有一个很好的洗牌数组。

我也知道添加更多rand()逻辑是可能的,但我希望用已实现的东西来做这件事 - 我不想重新发明轮子。

我怎样才能实现理想的洗牌?

3 个答案:

答案 0 :(得分:3)

shuffle()正在按计划运作。它不是“随机化第二维度”,它不是递归的。

重新排序数组的元素(恰好是数组)。您看到的问题是因为shuffle()重置了数组的键。

来自文档(http://php.net/shuffle):

  

注意:此函数为数组中的元素指定新键。它将删除可能已分配的任何现有密钥,而不是   只需重新排序密钥。

为了得到你想要的东西,你需要使用array_rand()随机化键,然后根据它重新排序数组中的元素。

$randKeys = array_rand($array, count($array));
// This is needed because array_rand was changed
// and now returns the keys in order
shuffle($randKeys);

uksort($array, function($a, $b) use($randKeys){
    return array_search($a, $randKeys) - array_search($b, $randKeys);
});

DEMO:https://eval.in/101265

答案 1 :(得分:0)

在随机播放PHP手册的评论部分,您会找到:

<?php
function shuffle_assoc(&$array) {
    $keys = array_keys($array);

    shuffle($keys);

    foreach($keys as $key) {
        $new[$key] = $array[$key];
    }

    $array = $new;

    return true;
}
?>

答案 2 :(得分:0)

$yourArray = array(
    array('key1' => 199, 'key2' => 6),
    array('key1' => 195, 'key2' => 3),
    array('key1' => 205, 'key2' => 8)
);

$helperArr = array();
foreach($yourArray as $subArr)
{
    foreach($subArr as $key => $value)
        $helperArr[$key][] = $value;        
}

foreach($helperArr as &$shuffleArr)
    shuffle($shuffleArr);

$shuffledArr = array();
foreach($helperArr as $key => $value)
{   
    for($i = 0; $i < count($value); $i++)
        $shuffledArr[$i][$key] = $value[$i];        
}

echo '<pre>';
print_r($helperArr);
print_r($shuffledArr);
echo '</pre>';

DEMO