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

pqwbnv8z  于 2023-01-29  发布在  PHP
关注(0)|答案(3)|浏览(143)

我有一个如下格式的数组,如何按键升序排列每一行的数据?

[
    [
        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(),但没有成功。

mrphzbgm

mrphzbgm1#

使用array_combinehttp://php.net/manual/en/function.array-combine.php)合并数组,然后使用ksorthttp://php.net/manual/en/function.ksort.php)对键进行排序。

ia2d9nvy

ia2d9nvy2#

如果开发人员事先知道这些键,则可以在默认数组中硬编码键的顺序,然后覆盖这些值。
foreach()通过引用修改循环(Demo

$defaults = array_fill_keys(range(20, 100, 20), 0); 
foreach ($array as &$row) {
    $row = array_replace($defaults, $row);
}
var_export($array);

foreach()以填充新阵列:(Demo

$defaults = array_fill_keys(range(20, 100, 20), 0);
$result = []; 
foreach ($array as $row) {
    $result[] = array_replace($defaults, $row);
}
var_export($result);

array_map():(Demo

$defaults = array_fill_keys(range(20, 100, 20), 0); 
var_export(
    array_map(
        fn($row) => array_replace($defaults, $row),
        $array
    )
);

请记住,array_merge()不能与数字键. Watch it not work properly一起正常工作。
如果事先不知道键,可以使用经典循环或函数迭代器对键进行排序。
foreach()循环通过引用修改行:(一对四对一对)

foreach ($array as &$row) {
    ksort($row);
}
var_export($array);

请注意,如果不使用&,则排序将应用于循环正在迭代的数组的“副本”(而不是迭代原始数组)。Watch it not work properly
array_walk()相同,您必须通过引用修改,否则自定义函数内部的进程将看起来被遗忘/丢失。(Demo

array_walk($array, fn(&$row) => ksort($row));
var_export($array);

array_map()也可能适用,不需要通过引用进行修改。(Demo

var_export(
    array_map(
        function($row) {
            ksort($row);
            return $row;
        },
        $array
    )
);
55ooxyrt

55ooxyrt3#

使用ksort,它按键对数组排序
假设您的阵列是$array

foreach($array as $a){
   foreach($a as $sort_me){
     ksort($sort_me);
   }
}

相关问题