【发布时间】:2017-08-14 12:44:11
【问题描述】:
我需要帮助按字母顺序对下面数组的键和值进行排序:
$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'],
],
];
我将不胜感激。
【问题讨论】:
-
显示预期数组的外观
-
@RomanPerekhrest 我已经包含了预期结果的视图。
-
您不能一个接一个地按两个这样的标准进行排序,并期望这不会把事情搞砸,如果两个标准只是导致 的 不同 排序相同的 元素。如果您按键对上层进行排序 - 那么 没有意义 然后再按值对同一级别进行排序。
-
@CBroe 我同意。我想也许我可以让这些方法适用于不同的元素。按字母顺序排序值实际上仅适用于在条目数组中找到的数值数组,例如
['c', 'b', 'a'], -
那么你需要找到一种方法来区分这两种情况。要么去检查你在当前级别上拥有什么样的钥匙;或者检查当前数组中的项目是数组本身还是标量值就足够了……?
标签: php arrays sorting recursion multidimensional-array