递归键排序功能不影响较低级别的项目[重复]

问题描述 投票:0回答:6

我有一个简单的多数组,如下所述,我需要按其键标签(而不是键值)进行排序。

array(
    1 => array(
        2 => array();
        11 => array();
        20 => array();
        31 => array();
        4 => array();
        43 => array();
        12 => array();
        3 => array();
    );
    2 => array();
    11 => array();
    20 => array();
    31 => array();
    4 => array();
    43 => array();
    12 => array();
    3 => array(); );

这是我的订购功能:

private function orderByKey(&$array) {
        ksort($array);
        foreach($array as $value) {
            if (is_array($value)) {
                $this->orderByKey($value);
            }
        }
    }

递归项目未排序。

这里可能出了什么问题?

php arrays sorting recursion multidimensional-array
6个回答
4
投票

您需要访问 $value 作为对 $array 中条目的引用

private function orderByKey(&$array) {
        ksort($array);
        foreach($array as &$value) {
            if (is_array($value)) {
                $this->orderByKey($value);
            }
        }
    }

1
投票

sort() 和 ksort() 的第二个参数是 sort_flags。当您希望它按数字排序,而不是按字符串值排序(如当前所示)时,您必须设置该参数:

ksort($my_array, SORT_NUMERIC);

查看 sort() 页面,其中解释了不同的排序标志:http://www.php.net/manual/en/function.sort.php


1
投票

您可以使用

natksort
功能。


1
投票

除了不对子数组进行排序之外,我还阅读了您的问题,即您在按照问题中概述的顺序对键进行排序时遇到问题(

1, 11, 12, 2, 20, 3, 31, ...
):

uksort($array, function($a, $b) {
    return strcmp("$a ", "$b ");
});

这种排序确实会用空格填充每个键,以便 3 大于 20 但小于 30。

完整代码:

private function orderByKey(&$array) {
    if (!is_array($array)) return;
    uksort($array, function($a, $b) {
        return strcmp("$a ", "$b ");
    });
    array_walk($array, [$this, 'orderByKey']);
}

或者如果

ksort()
适合您:

private function orderByKey(&$array) {
    if (!is_array($array)) return;
    ksort($array);        
    array_walk($array, [$this, 'orderByKey']);
}

0
投票

http://www.php.net/manual/en/function.uksort.php

是您搜索的内容;而不是 ksort:

uksort($array, function ($a, $b) { return $a - $b; });

0
投票
 ksort($myarray);
 foreach ($myarray as $key => $val) {
     echo "$key = $val\n";
 }
© www.soinside.com 2019 - 2024. All rights reserved.