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

11 浏览
0 Comments

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

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

预期结果:

[
    [
        20 => 0,
        40 => 2,
        60 => 0,
        80 => 1,
        100 => 0,
    ],
    [
        20 => 0,
        40 => 0,
        60 => 2,
        80 => 1,
        100 => 0,
    ],
]

我尝试使用array_values()array_combine(),但没有成功。

0
0 Comments

问题的原因是需要对一个二维数组的每一行的键进行排序。解决方法是使用array_combine函数将数组合并,然后使用ksort函数对键进行排序。

在PHP中,array_combine函数可以将两个数组合并为一个新的数组,其中一个数组的值作为新数组的键,另一个数组的值作为新数组的值。这样,我们可以将二维数组的每一行的键和值分别作为两个数组,然后使用array_combine函数将它们合并为一个新的数组。

然后,我们可以使用ksort函数对新数组的键进行排序。ksort函数会按照键的字母顺序对数组进行排序,保持键和值的关联关系。

下面是一个示例代码,演示了如何使用array_combineksort函数对二维数组的每一行的键进行排序:

$originalArray = array(
    array("c" => 3, "a" => 1, "b" => 2),
    array("b" => 2, "a" => 1, "c" => 3),
    array("a" => 1, "c" => 3, "b" => 2)
);
$sortedArray = array();
foreach ($originalArray as $row) {
    $keys = array_keys($row);
    $values = array_values($row);
    array_combine($keys, $values);
    ksort($row);
    $sortedArray[] = $row;
}
print_r($sortedArray);

执行以上代码,输出结果为:

Array

(

[0] => Array

(

[a] => 1

[b] => 2

[c] => 3

)

[1] => Array

(

[a] => 1

[b] => 2

[c] => 3

)

[2] => Array

(

[a] => 1

[b] => 2

[c] => 3

)

)

以上代码首先定义了一个二维数组$originalArray,其中包含了三个具有不同键的数组。然后,通过遍历$originalArray,分别获取每一行的键和值,并使用array_combine函数将它们合并为一个新的数组。接着,使用ksort函数对新数组的键进行排序。最后,将排序后的行添加到一个新的数组$sortedArray中。

通过以上方法,我们可以对二维数组的每一行的键进行排序。这个方法可以用于各种需要对二维数组进行排序的场景,例如按照某个特定的键进行排序,或者按照键的字母顺序进行排序。

0
0 Comments

问题的出现原因:

在一个二维数组中,需要对每一行的键进行排序。但是,由于键的顺序不确定,开发者需要找到一种方法来对键进行排序。

解决方法:

如果键的顺序事先已知,开发者可以在一个默认数组中硬编码键的顺序,然后覆盖值。这可以通过以下几种方法来实现:

1. 使用foreach循环并通过引用进行修改:

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

2. 使用foreach循环来填充一个新数组:

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

3. 使用array_map函数:

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

如果键的顺序事先不知道,开发者可以使用经典循环或函数迭代器来对键进行排序。以下是几种解决方法:

1. 使用foreach循环通过引用修改行:

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

需要注意的是,如果不使用引用符号&,排序将应用于循环正在迭代的数组的“副本”(而不是原始数组)。

2. 使用array_walk函数:

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

与foreach循环类似,需要确保使用了引用,否则自定义函数内部的处理将被忽略。

3. 使用array_map函数:

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

使用array_map函数同样可以对键进行排序,而且不需要修改引用。

需要注意的是,array_merge函数在处理数字键时不能正常工作。

0