我想将以下输入数组中的所有 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);
要迭代 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']
)
);
您必须在每个嵌套循环中通过引用显式修改。注意 ~&
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']);