PHP数组排序键

时间:2013-04-09 13:17:28

标签: php multidimensional-array

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

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(); );

问题是我的排序是按照以下顺序返回我的数组:

1, 11, 12, 2, 20, 3, 31,等...... 而不是1,2,3,4,11,12,等..

这是我的订购功能:

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

这里可能有什么问题?

感谢。

6 个答案:

答案 0 :(得分:4)

您需要访问$ value作为$ array

中条目的引用
private function orderByKey(&$array) {
        ksort($array);
        foreach($array as &$value) {
            if (is_array($value)) {
                $this->orderByKey($value);
            }
        }
    }

答案 1 :(得分:1)

sort()和ksort()的第二个参数是sort_flags。如果希望按数字排序,而不是按字符串值排序(当前看起来像),则必须设置该参数:

ksort($my_array, SORT_NUMERIC);

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

答案 2 :(得分:1)

您可以使用natksort功能。

答案 3 :(得分: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']);
}

答案 4 :(得分:0)

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

你搜索的是什么;而不是ksort:

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

答案 5 :(得分:0)

 ksort($myarray);
 foreach ($myarray as $key => $val) {
     echo "$key = $val\n";
 }