【问题标题】:Alphabetically sort multidimensional array's keys and values recursively in PHP在 PHP 中按字母顺序递归地对多维数组的键和值进行排序
【发布时间】: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


【解决方案1】:

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

<?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
                )

        )

)

【讨论】:

  • 我发现这个解决方案适用于我尝试过的所有阵列布局。谢谢。
【解决方案2】:
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);

【讨论】:

    【解决方案3】:

    使用以下方法并循环遍历$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);
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 2011-10-31
      • 2012-04-09
      • 1970-01-01
      • 2010-12-12
      相关资源
      最近更新 更多