我有一个如下所述的简单多数组,我需要通过其键标签(而不是键值)进行排序。
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);
}
}
}
这里可能有什么问题?
感谢。
答案 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";
}