【问题标题】:How can I mix array's items up?如何混合数组的项目?
【发布时间】:2017-04-30 06:24:15
【问题描述】:

我有一个这样的数组:

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

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

无论如何,我怎样才能既洗牌数组又保留键?

【问题讨论】:

标签: php arrays


【解决方案1】:

试试这个功能

function shuffle_assoc($array) {
    $keys = array_keys($array);

    shuffle($keys);

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

    return $new;
}

【讨论】:

  • 不客气,解决方案来自php.net上shuffle()页面的第一条评论,php.net/manual/en/function.shuffle.php
  • 我认为 OP 要求保留密钥并随机播放其余部分?
  • 也许,如果这是他想要的,那么我们将对函数@nevabyte进行一些修改
  • @redFIVE 是真的 ;) 但有时你无法注意到解决方案,即使它就在你面前,因为压力和疲倦。所以不要给出任何理由。
  • @redFIVE 感谢您称我为 tpp 懒人:-) .. 实际上我在问之前用谷歌搜索了我的问题,由于我的英语很差,我找不到预期的答案。
【解决方案2】:

这是一个基于随机排序的解决方案,它保留了键值关联,如下所示:

<?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

【讨论】:

    【解决方案3】:

    你可以使用array_multisort:

    function shuffle_assoc(array &$array)
    {
        $range = range(1, count($array));
        shuffle($range);
        array_multisort($range, $array);
    }
    

    这里是working demo

    【讨论】:

      【解决方案4】:

      像这样;

      $keys = array_keys($arr);
      $values = shuffle(array_values($arr));
      $shuffled = array_combine($keys, $values);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-15
        • 2011-04-09
        • 2010-10-20
        相关资源
        最近更新 更多