使用嵌套循环通过引用修改多维数组的第三层

问题描述 投票:0回答:2

我想将以下输入数组中的所有 0 值更改为 1 到 6 之间的随机数。

$_SESSION['diceRoll'] = [
    ["save_1" => ["pos1" => 0, "pos2" => 2, "pos3" => 0, "pos4" => 0, "pos5" => 3, "pos6" => 0]],
    ["save_2" => ["pos1" => 0, "pos2" => 6, "pos3" => 0, "pos4" => 5, "pos5" => 1, "pos6" => 0]],
    ["save_3" => ["pos1" => 2, "pos2" => 0, "pos3" => 5, "pos4" => 0, "pos5" => 2, "pos6" => 2]],
    ["save_4" => ["pos1" => 0, "pos2" => 6, "pos3" => 6, "pos4" => 5, "pos5" => 5, "pos6" => 0]],
    ["save_5" => ["pos1" => 2, "pos2" => 0, "pos3" => 4, "pos4" => 4, "pos5" => 0, "pos6" => 0]],
    ["save_6" => ["pos1" => 3, "pos2" => 0, "pos3" => 4, "pos4" => 0, "pos5" => 5, "pos6" => 5]]
];

任何已经非零的值都应保持不变。

我尝试使用以下代码通过引用修改数组,但似乎对数组没有任何影响。

function foo(&$var) {
  foreach ($var as $key) {
    foreach ($var as $key) {
      foreach ($var as $key => $value) {
        $value = mt_rand(1,6);
      }
    }
  }
}
unset($var); // break the reference

foo($diceRoll);
php arrays multidimensional-array foreach reference
2个回答
0
投票

要迭代 3 层嵌套并返回所需的有效负载,请使用

array_map()
调用读取最低关联元素,然后仅在使用 Elvis 运算符为零(“falsey”)时用随机值覆盖给定值。

代码:(演示

var_export(
    array_map(
        fn($set) => array_map(
            fn($row) => array_map(
                fn($v) => $v ?: rand(1,6),
                $row
            ),
            $set
        ),
        $_SESSION['diceRoll']
    )
);

0
投票

您必须在每个嵌套循环中通过引用显式修改。注意 ~&

prepended to each value variable of each
foreach()` 循环。

function changeZeroes(&$array) {
    foreach ($array as &$subarray) {
        foreach ($subarray as &$dice) {
            $dice = array_map(function($value) {
                return $value == 0 ? mt_rand(1, 6) : $value;
            }, $dice);
        }
    }
}

changeZeroes($_SESSION['diceRoll']);
© www.soinside.com 2019 - 2024. All rights reserved.