php - 在 PHP 中按字母顺序递归排序多维数组的键和值

标签 php arrays sorting recursion multidimensional-array

我需要帮助按字母顺序对下面数组的键和值进行排序:

$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/

相关文章:

algorithm - 有向无环图的拓扑排序

algorithm - Quicksort 算法中的递归如何工作?

PHP 对象属性

c++ - C++数组结构的误解

php - 循环遍历一个mysql字段

javascript - 如何将字符串数组作为参数传递给函数?

arrays - 如何在恒定时间内找到相关线性方程组的解?

c++ - 根据特定字段对结构 vector 进行排序

Javascript 无法从 PHP 变量获取值?

php - 增加天数的问题