如何在仍然知道原始索引的情况下对 PHP 中的数组进行洗牌?

How to shuffle an array in PHP while still knowing the original index?

如何在仍然知道原始索引的情况下打乱 PHP 数组?

我在 PHP 中有一个简单的数组(例如 ["a", "b", "c", [5, 10]])。

shuffle() 函数允许您随机排列元素。

不过我还是想知道原来的索引是什么。我该怎么做?

shuffle doc第二个例子:

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

        shuffle($keys);

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

        $array = $new;

        return true;
    }

你的意思是打乱元素并用它们的键保存它们,所以如果你 foreach 超过它们,它们会以打乱的顺序出现?这可以通过将数组重塑为 [key, value] 对的列表来实现:

$pairs = array_map(null, array_keys($array), array_values($array));

所以 ["a", "b", "c", [5, 10]] 变成 [[0, "a"], [1, "b"], [2, "c"], [3, [5, 10]]

然后,洗牌:

shuffle($pairs);

最终可能会像这样(显然每次都是随机的):

[[2, "c"], [1, "b"], [3, [5, 10]], [0, "a"]]

最后,re-shape再次将其转化为普通数组:

$shuffled = array_combine(array_column($pairs, 0), array_column($pairs, 1));

最终结果看起来像这样:

[2 => "c", 1 => "b", 3 => [5, 10], 0 => "a"]

这是你想要的吗?

不过,这只是一种方法。杰拉德的建议可能更有效。