我需要帮助按字母顺序对下面数组的键和值进行排序:
$unsorted = [
'D' => [
'C' => ['c', 'b', 'a'],
'B' => 'bvalue',
'A' => ['a', 'c', 'b'],
],
'C' => 'cvalue',
'B' => 'bvalue',
'A' => [
'Z' => 'zvalue',
'A' => 'avalue',
'B' => 'bvalue',
]
];
排序必须是递归的,因为上面的数组是多维的。它持有其他数组(数字索引和关联)作为其值。
我设法使用这个函数对数组的键进行递归排序:
function sortKeysRecursive(&$array)
{
foreach ($array as $key => &$value) {
if (is_array($value)) {
sortKeysRecursive($value);
}
}
ksort($array);
}
但是,我无法在不弄乱已经排序的键的情况下对值进行排序。为了对值进行排序,我尝试应用此函数:
function sortValuesRecursive(&$array)
{
foreach ($array as &$value) {
if (is_array($value)) {
sortValuesRecursive($value);
}
}
asort($value);
}
sortKeysRecursive($unsorted);
sortValuesRecursive($unsorted);
但这是一个或另一个。应用于同一个数组的两个函数总是会扰乱其他函数的工作。
我希望生成如下所示的排序数组:
$sorted = [
'A' => [
'A' => 'avalue',
'B' => 'bvalue',
'Z' => 'zvalue',
],
'B' => 'bvalue',
'C' => 'cvalue',
'D' => [
'A' => ['a', 'b', 'c'],
'B' => 'bvalue',
'C' => ['a', 'b', 'c'],
],
];
我将不胜感激。
最佳答案
您需要检查键是数字还是字母。尝试以下解决方案,您可能需要根据您的目的修改条件:
<?php
function isAssoc(array $arr)
{
return array_keys($arr) !== range(0, count($arr) - 1);
}
function sortArray(&$arr){
if(isAssoc($arr)){
ksort($arr);
} else{
asort($arr);
}
foreach ($arr as &$a){
if(is_array($a)){
sortArray($a);
}
}
}
$unsorted = array(
'D' => array(
'C' => array('c', 'b', 'a'),
'B' => 'bvalue',
'A' => array('a', 'c', 'b'),
),
'C' => 'cvalue',
'B' => 'bvalue',
'A' => array(
'Z' => 'zvalue',
'A' => 'avalue',
'B' => 'bvalue',
)
);
sortArray($unsorted);
print_r($unsorted);
输出
Array
(
[A] => Array
(
[A] => avalue
[B] => bvalue
[Z] => zvalue
)
[B] => bvalue
[C] => cvalue
[D] => Array
(
[A] => Array
(
[0] => a
[2] => b
[1] => c
)
[B] => bvalue
[C] => Array
(
[2] => a
[1] => b
[0] => c
)
)
)
关于php - 在 PHP 中按字母顺序递归排序多维数组的键和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42951028/