仅对二维数组的每一行中的键进行排序


Sort only the keys in each row of a 2d array

我有一个以下格式的数组。 如何按键以升序对每行的数据进行排序?

[
    [
        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
    )
);