【问题标题】:sorting a column in a PHP array对 PHP 数组中的列进行排序
【发布时间】:2012-10-25 16:10:00
【问题描述】:

我正在尝试按如下所示构建的数据结构中的列进行排序:

 $counter = 1;
 $entity_list = array();

 foreach($result as $rec){
   $entity_list[$counter]['student_first_name'] = $rec->firstname;
   $entity_list[$counter]['student_last_name'] = $rec->lastname;
   $entity_list[$counter]['course_name'] = $rec->fullname;
   .
   .
   $counter++;
 }//end foreach

这是 $entity_list 数据结构的 var_dump。

array (size=150)     
  1 => 
  array (size=3)
    'student_first_name' => string 'Jane' (length=6)
    'student_last_name' => string 'Smith' (length=7)
    'course_name' => string 'Algebra 1A-MOD' (length=14)

  2 => 
  array (size=3)
    'student_first_name' => string 'Fred' (length=6)
    'student_last_name' => string 'Jones' (length=7)
    'course_name' => string 'Algebra 1A-MOD' (length=14)
   .
   .
   .

如何在这个结构上使用 asort() 或 ksort()?我想我应该使用 ksort(),因为它适用于一个键。例如,我尝试过 ksort($entity_list,'student_last_name') 或 asort($entity_list,'current_grade')。

谢谢。

【问题讨论】:

  • 看起来像是来自 db,使用 db 的排序选项。
  • 我应该注意到我正在从数据库中创建计算字段,我需要对其进行排序......

标签: php arrays asort ksort


【解决方案1】:

你可以使用uasort

uasort($entity_list, 'mySort');

function mySort($a, $b) {
    return ($a['student_last_name'] <==> $b['student_last_name']);
}

但如果您的数据来自数据库,那么 ORDER BY 会更容易、更轻松。

【讨论】:

  • 您也可以在 PHP7 或更高版本中使用 spaceship 运算符。大大提高了可读性。
【解决方案2】:

最简单的方法是像这样使用带有 uasort 的回调

假设我正在按名为时间戳的列对一组交易进行排序...

uasort($trades, function ($a, $b) { 
    return ( $a['timestamp'] > $b['timestamp'] ? 1 : -1 ); 
});

【讨论】:

    【解决方案3】:
    function mySort($a, $b) {
        if($a['student_last_name'] == $b['student_last_name']) {
            return 0;
        }
        return ($a['student_last_name'] < $b['student_last_name']) ? -1 : 1; }
    

    不,不,不!!!太丑了。

    function mySort($a, $b) {
        return $a['student_last_name'] - $b['student_last_name'];
    }
    

    【讨论】:

      【解决方案4】:

      你可以使用uasort(),像这样:

      function cmp($a, $b) {
          $sortby = 'student_last_name'; //define here the field by which you want to sort
          return strcmp($a[$sortby] , $b[$sortby]);
      }
      
      uasort($array, 'cmp');
      

      【讨论】:

        【解决方案5】:

        如果您可以使用 MySQL,请使用它。或者像这样尝试array_multisort()

        $data[] = array('volume' => 67, 'edition' => 2);
        $data[] = array('volume' => 86, 'edition' => 1);
        $data[] = array('volume' => 85, 'edition' => 6);
        
        foreach ($data as $key => $row) {
            $volume[$key]  = $row['volume'];
            $edition[$key] = $row['edition'];
        }
        
        array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
        

        【讨论】:

          【解决方案6】:

          据我所知或测试过,php 5+ 对这个功能更稳定。

          function orderBy($data=NULL,$field='order',$order='asc') 
              {
                  if (!is_null($data)) {
                      define('FIELD_TARGET',$field); define('ORDER_DIRECTION',$order);
                      usort($data,function($a, $b) { 
                          if (ORDER_DIRECTION == 'desc') { return ($b[''.FIELD_TARGET.''] - $a[''.FIELD_TARGET.'']); } 
                          else { return ($a[''.FIELD_TARGET.''] - $b[''.FIELD_TARGET.'']); }
                      }); return $data;
                  }
              }
          

          【讨论】:

            【解决方案7】:

            它可能适用于常见情况。

            PHP 5.4 >

            function arraySortByCol(&$arr, $col, $dir = 'asc')
            {
                usort($arr,function($a,$b) use ($col, $dir) {
                    return ($dir === 'asc')
                        ? strcmp($a[$col], $b[$col])
                        : strcmp($b[$col], $a[$col]);
                });
            }
            

            PHP 7 >

            function arraySortByCol(&$arr, $col, $dir = 'asc')
            {
                usort($arr,function($a,$b) use ($col, $dir) {
                    return ($dir === 'asc')
                        ? $a[$col] <=> $b[$col]
                        : $b[$col] <=> $a[$col];
                });
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-10-26
              • 1970-01-01
              • 1970-01-01
              • 2013-09-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多