【问题标题】:PHP Sorting a multi-dimensional array by field namePHP按字段名称对多维数组进行排序
【发布时间】:2010-09-03 14:10:02
【问题描述】:

我已尝试调整此代码以用于对命名键/字段上的多维数组进行排序。该字段是一个整数,我需要从最小到最大排序。

function myCmp($a, $b)
{
    return strcmp($a["days"], $b["days"]);
}

uasort($myArray, "myCmp");

这会根据我的需要对数组进行排序,但顺序错误。目前它从大到小排序,不使用自然顺序。我需要按自然顺序从小到大排序(例如 2 在 5、12 和 24 之前)。

【问题讨论】:

    标签: php arrays sorting multidimensional-array


    【解决方案1】:

    strnatcmp()是你的朋友

    例如(使用 php 5.3 闭包/anonymous function):

    <?php
    $myArray = array( 'foo'=>array('days'=>2), 'bar'=>array('days'=>22), 'ham'=>array('days'=>5), 'egg'=>array('days'=>12) );
    uasort($myArray, function($a, $b) { return strnatcmp($a["days"], $b["days"]); });
    
    foreach($myArray as $k=>$v) {
      echo $k, '=>', $v['days'], "\n";
    }
    

    打印

    foo=>2
    ham=>5
    egg=>12
    bar=>22
    

    【讨论】:

      【解决方案2】:

      你可以颠倒 strcmp 的参数:

      function myCmp($a, $b)
      {
        return strcmp($b["days"], $a["days"]);
      }
      
      uasort($myArray, "myCmp");
      

      【讨论】:

        【解决方案3】:

        既然你想按自然顺序排序,你不应该使用strcmp,你可以这样做:

        function myCmp($a, $b)
        {
          if ($a['days'] == $b['days']) return 0;
          return ($b['days'] > $a['days']) ? -1 : 1;
        }
        

        这是working example

        【讨论】:

        • 如果有人还在看,这不会返回自然顺序。对于数字 27、2、5,它返回 5、27、2
        猜你喜欢
        • 1970-01-01
        • 2016-10-16
        • 2012-06-15
        • 1970-01-01
        • 2011-09-03
        • 1970-01-01
        • 2011-11-04
        相关资源
        最近更新 更多