如何用对象对多维数组进行排序?

时间:2012-12-01 08:57:47

标签: php arrays

问题:如何用对象对多维数组进行排序?

状态:我有一个数组如下。

array(3) {
  [0]=>
  object(Photo_model)#25 (5) {
    ["id"]=>
    int(5)
    ["file_name"]=>
    string(36) "A49361605AE049D687CDC3FEAF7D3236.jpg"
    ["user_id"]=>
    int(1)
    ["challenge_id"]=>
    string(1) "2"
    ["score"]=>
    int(19)
  }
  [1]=>
  object(Photo_model)#28 (5) {
    ["id"]=>
    int(2)
    ["file_name"]=>
    string(36) "A49361605AE049D687CDC3FEAF7D3236.jpg"
    ["user_id"]=>
     int(1)
    ["challenge_id"]=>
    string(1) "2"
    ["score"]=>
    int(10)
  }
  [2]=>
  object(Photo_model)#29 (5) {
      ["id"]=>
      int(3)
      ["file_name"]=>
      string(36) "A49361605AE049D687CDC3FEAF7D3236.jpg"
      ["user_id"]=>
      int(1)
      ["challenge_id"]=>
      string(1) "2"
      ["score"]=>
      int(15)
  }
}

我试图按分数对数组进行排序。我创建了一个函数如下。

aarsort (&$array, 'score');
function aarsort (&$array, $key) {
    $sorter=array();
    $ret=array();
    reset($array);
    foreach ($array as $ii => $va) {
        $sorter[$ii]=$va[$key];
    }
    arsort($sorter);
    foreach ($sorter as $ii => $va) {
        $ret[$ii]=$array[$ii];
    }
    $array=$ret;
}

但它不起作用。如何按键(score)对多维数组进行排序?

结果应该是id => 5,3,2

3 个答案:

答案 0 :(得分:3)

您的数组只有1维,每个数组项中都有一个对象。

毕竟,要对由对象组成的一维数组进行排序,并按对象的某个属性排序,请使用usort

usort($array, function($a, $b) {
    return $a->score - $b->score
});

要从上面获取id => 5, 3, 2,只需从上面的代码循环遍历数组并访问该属性即可获取它

$ids = array();
foreach ($array as $item) {
    $ids[] = $item->id;
}
var_dump($ids);

我不确定订单是否正确。如果结果是反向顺序,只需在usort函数中否定闭包的结果。

答案 1 :(得分:0)

这只是一个例子。

//$newarray for store all array id
//$array is your previous array . You just enter your all index whose key id store in new array 
$newarray = array();
foreach($array as $obj => $id)
{
    $newarray[] = $id[$key];
}

array_multisort($newarray,SORT_ASC,$array);

答案 2 :(得分:0)

我已经通过php.net

完成了这个问题
// Obtain a list of columns
                foreach ($array as $key => $row) {
                    $_score[$key]  = $row->score;
                }

                // Sort the data with volume descending, edition ascending
                // Add $data as the last parameter, to sort by the common key
                array_multisort($_score, SORT_DESC, $array);