我有一个以下格式的数组。 如何按键以升序对每行的数据进行排序?
[
[
40 => 2,
80 => 1,
20 => 0,
60 => 0,
100 => 0,
],
[
60 => 2,
80 => 1,
20 => 0,
40 => 0,
100 => 0,
],
]
预期成果:
[
[
20 => 0,
40 => 2,
60 => 0,
80 => 1,
100 => 0,
],
[
20 => 0,
40 => 0,
60 => 2,
80 => 1,
100 => 0,
],
]
我尝试使用array_values()
和array_combine()
,但没有运气。
array_combine
(http://php.net/manual/en/function.array-combine.php) 组合数组,然后使用 ksort
(http://php.net/manual/en/function.ksort.php) 对键进行排序。
如果开发人员事先知道密钥,则可以对默认数组中的密钥顺序进行硬编码,然后覆盖这些值。
通过引用修改foreach()
循环(演示)
$defaults = array_fill_keys(range(20, 100, 20), 0);
foreach ($array as &$row) {
$row = array_replace($defaults, $row);
}
var_export($array);
foreach()
填充新数组:(演示)
$defaults = array_fill_keys(range(20, 100, 20), 0);
$result = [];
foreach ($array as $row) {
$result[] = array_replace($defaults, $row);
}
var_export($result);
array_map()
: (演示)
$defaults = array_fill_keys(range(20, 100, 20), 0);
var_export(
array_map(
fn($row) => array_replace($defaults, $row),
$array
)
);
请记住,array_merge()
不能正常工作。看着它无法正常工作。
如果事先不知道键,则可以使用经典循环或函数迭代器对键进行排序。
foreach()
循环通过引用修改行:(演示)
foreach ($array as &$row) {
ksort($row);
}
var_export($array);
请注意,如果您不使用 &
,则排序将应用于循环迭代的数组的"副本"(而不是迭代原始数组)。看着它无法正常工作。
与array_walk()
相同,您必须通过引用进行修改,否则自定义函数内部的进程将被遗忘/丢失。(演示)
array_walk($array, fn(&$row) => ksort($row));
var_export($array);
<小时 /> array_map()
也可以是合适的,不需要通过引用进行修改。(演示)
var_export(
array_map(
function($row) {
ksort($row);
return $row;
},
$array
)
);