【问题标题】:Order an array of objects by using a different sort array [duplicate]使用不同的排序数组对对象数组进行排序[重复]
【发布时间】:2013-06-04 10:45:49
【问题描述】:

我对一些数组排序有点卡住了,也许有人可以帮助我?

给定这两个数组:

$sortOrder = array(12, 20, 4);

$data = array(
    (object)array(
        'id' => 4,
        'name' => 'Tom' 
    ),
    (object)array(
        'id' => 12,
        'name' => 'Bob' 
    ),
    (object)array(
        'id' => 20,
        'name' => 'Max' 
    ) 
) 

我想按照$sortOrder 中指定的id 顺序对$data 进行排序。

所以排序后我希望 $data 是这样的:

$data = array(
    (object)array(
        'id' => 12,
        'name' => 'Bob' 
    ),
    (object)array(
        'id' => 20,
        'name' => 'Max' 
    ), 
    (object)array(
        'id' => 4,
        'name' => 'Tom' 
    ),
) 

我该怎么做?

【问题讨论】:

    标签: php sorting


    【解决方案1】:

    请试试这个。它将作为您的预期输出打印。

      $sortOrder = array(12, 20, 4);
    
     $data = array(
        array(
            'id' => 4,
            'name' => 'Tom' 
       ),
      array(
             'id' => 12,
             'name' => 'Bob' 
         ),
         array(
             'id' => 20,
             'name' => 'Max' 
         ) 
     );
    
     $sortedArray = array();
     foreach($sortOrder as $id) 
     {
         foreach($data as $_data)
         {
             if($_data["id"] == $id)
             {
                 $sortedArray[] = $_data;
                 break;
             }
         }
     }
    
     print_r($sortedArray);
    

    【讨论】:

      【解决方案2】:

      usort 会帮助你。

      usort($data, function ($a, $b) use ($sortOrder) {
         $pos1 = array_search($a->id, $sortOrder);
         $pos2 = array_search($b->id, $sortOrder);
      
         return ($pos1 === $pos2) ? 0 : ($pos1 < $pos2 ? -1 : 1);
      });
      

      【讨论】:

      • 谢谢,这是最优雅的方法。
      【解决方案3】:

      您尝试使用 sort 和 foreach 来实现吗? http://php.net/manual/en/function.sort.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-11
        • 2021-11-04
        • 1970-01-01
        • 1970-01-01
        • 2017-04-27
        • 2020-12-11
        • 2014-08-04
        • 2023-03-26
        相关资源
        最近更新 更多