0

質問: 多次元配列をオブジェクトでソートする方法は?

ステータス:次のような配列があります。

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 である必要があります

4

3 に答える 3

3

配列は 1 次元のみで、各配列項目にオブジェクトがあります。

結局のところ、オブジェクトで構成される 1D 配列を並べ替え、オブジェクトの特定のプロパティで並べ替えるには、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関数内のクロージャーの結果を否定するだけです。

于 2012-12-01T09:21:46.867 に答える
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);
于 2012-12-01T12:45:33.720 に答える
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);
于 2012-12-01T09:33:29.520 に答える