PHP反向排序关联数组arsort()不起作用?

时间:2017-05-11 19:48:23

标签: php arrays sorting associative-array reverse

是否有人能够指出我正确的方向为什么我不能让arsort()在以下方面工作:

$d=array();
$d['y'][0]['year'] = 2000;
$d['y'][1]['year'] = 2001;
$d['y'][2]['year'] = 2002;
$d['y'][3]['year'] = 2003;
$d['y'][4]['year'] = 2004;
$d['y'][5]['year'] = 2005;

arsort($d['y']);

$i=0
foreach ($d['y'] as $value){
$i++;

echo $d['y'][$i]['year'];

}

它只是按照0,1,2,3,4等顺序回响......我似乎无法找到我在这里失踪的东西?

由于

4 个答案:

答案 0 :(得分:1)

您的代码是正确的,但在打印时出错。 通过引用索引为$ d [' y'] [' 5'] [' year']的值,结果将始终为2005年。因此, foreach以升序显示年份。请尝试改为:

foreach($d['y'] as $value) {
   echo $value['year'];
}

你会发现你的数组的顺序是相反的。

(不要在foreach循环中使用变量$ i)

答案 1 :(得分:0)

里卡多指出我正确的方向,我发现我需要使用:

echo $value['year'];

而不是

echo $d['y'][$i]['year'];

因为$ i计数器直接调用索引号而不是在循环时使用排序数组。

答案 2 :(得分:0)

由于arsort()维护键关联,因此重新排序的多维数组将使第0个元素为last,并且元素5首先出现。如果变量$ i最初设置为零,则使用foreach循环可能会使代码无法显示反向排序数组。为了避免这种无意的错误以及提高性能和简化代码,可以替换foreach-loop,如下所示:

<?php

function showData($value,$key){
    echo "$value\n";
}
array_walk_recursive( $d, 'showData');

array_walk_recursive(),顾名思义,递归遍历一个数组来查找数据。回调允许人们轻松访问和显示值。

请参阅demo

答案 3 :(得分:0)

这是因为arsort()会保留密钥。您可以查看手册here

所以在arsort()之后,$ d就像下面一样,但是你以相反的方式打印,这使得它没有被排序。查看live demo

Array
(
    [y] => Array
        (
            [5] => Array
                (
                    [year] => 2005
                )

            [4] => Array
                (
                    [year] => 2004
                )

            [3] => Array
                (
                    [year] => 2003
                )

            [2] => Array
                (
                    [year] => 2002
                )

            [1] => Array
                (
                    [year] => 2001
                )

            [0] => Array
                (
                    [year] => 2000
                )

        )

)