按字母顺序排序多维数组';在PHP中递归地调用s键和值

按字母顺序排序多维数组';在PHP中递归地调用s键和值,php,arrays,sorting,recursion,multidimensional-array,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',

我需要帮助按字母顺序排列以下数组的键和值:

$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);
但是,我无法对值进行排序,而不会弄乱已排序的键。要对我尝试应用此函数的值进行排序,请执行以下操作:

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'],
    ],
];

我将非常感谢您的帮助。

使用以下方法,在
$unsorted
数组中循环并有条件地排序:

function recursiveSort(array &$unsorted) {

    // Sort array keys
    ksort($unsorted);

    foreach ($unsorted as $key => $array) {
        if (!is_array($array)) {
            continue;
        }

        if (is_numeric(key($array))) {
            asort($array);
        } else {
            recursiveSort($array);
        }
        $unsorted[$key] = $array;
    }
}
用法:

recursiveSort($unsorted);

希望对您有所帮助

您需要检查键是否为数字或字母。请尝试以下解决方案,您可能需要为您的目的修改条件:

function sortKeysRecursive(&$array)
{
    foreach ($array as $key => &$value) {
        if (is_array($value)) {
            sortKeysRecursive($value);
        }
    }

    ksort($array);
}

/**
 * Sort only the arrays that doesn't have a child array, this way
 * we don't mess with what sortKeysRecursive has sorted
 */
function sortValuesRecursive(&$array)
{
    $isArray = false;

    foreach ($array as $key => &$value) {
        if (is_array($value)) {
            $isArray = true;
            sortValuesRecursive($value);
        }
    }

    if ($isArray === false) {
        asort($array);
    }
}

sortKeysRecursive($unsorted);
sortValuesRecursive($unsorted);
<?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@RomanPerekhrest我已经包含了预期结果的视图。如果两个条件只是导致同一元素的顺序不同,那么您不能一个接一个地按这两个条件进行排序,也不能期望这不会把事情搞砸。如果按键对上层进行排序,那么以后再按值对同一层进行排序是没有意义的。@CBroe我同意。我想也许我可以让这些方法在不同的元素上工作。按字母顺序排列的值实际上只适用于条目数组中的数字数组,例如,
['c',b',a'],
,然后您需要找到区分这两种情况的方法。或者去检查你在当前关卡上有什么类型的钥匙;或者,检查当前数组中的项是数组本身还是标量值就足够了…?我发现这个解决方案适用于我尝试过的所有数组布局。非常感谢。