1

N 個の配列があります (例: 3 つの配列):

$arr1 = array(0 => array('id' => 34, 'score' => 440),
          1 => array('id' => 32, 'score' => 140),
          2 => array('id' => 22, 'score' => 121),
          3 => array('id' => 99, 'score' => 532)
    );

$arr2 = array(0 => array('id' => 32, 'score' => 213),
          1 => array('id' => 34, 'score' => 354),
          2 => array('id' => 22, 'score' => 674)
    );

$arr3 = array(0 => array('id' => 34, 'score' => 10),
          1 => array('id' => 22, 'score' => 449),
          2 => array('id' => 99, 'score' => 586),
          3 => array('id' => 32, 'score' => 113),
          4 => array('id' => 16, 'score' => 777)

    );

これらの (N) 配列を (id) と (スコア) に応じて並べ替えたいのですが、すべての配列で繰り返し ID の出現を優先し、2 番目の優先度を最大スコアにすると、結果は (1 ) これらの並べ替え規則に従って一意の ID を保持する、フィルター処理された一意の配列。

usort比較関数を渡すためにphp関数を使用してこれを実行しようとしましたが、うまくいきませんでした。

4

1 に答える 1

1

データのソースが mysql データベースからのものである場合、このカスタム ソートは単純な sql クエリで簡単に取得できます。

しかし、配列を直接操作する必要がある場合は、これも機能するはずです: (汚いコーディングと移動性の悪さで申し訳ありません。)

$all_arrays = array_merge( $arr1, $arr2, $arr3 ); // merge all arrays into one
$items = $ascores = $scores = $occurs = $sorted_ids = array();
foreach( $all_arrays as $elem ) {
    if(isset($occurs[ $elem['id'] ])) { $occurs[ $elem['id'] ]++; } else { $occurs[ $elem['id'] ] = 1; }
    if( ! isset($ascores[ $elem['id'] ]) || $elem['score'] > max( $ascores[ $elem['id'] ] ) ) { 
        $ascores[ $elem['id'] ][] = $elem['score']; 
        $scores[ $elem['id'] ] = $elem['score']; 
    }
    $items[ $elem['id'] ] = array( 'id'=>$elem['id'], 'maxs'=>$scores[ $elem['id'] ], 'occs'=>$occurs[ $elem['id'] ] );
}

array_multisort( $occurs, SORT_DESC, $scores, SORT_DESC, $items);
/// print_r( $items ); // $items holds unique sorted data. outputs: Array ( [0] => Array ( [id] => 22 [maxs] => 674 [occs] => 3 ) [1] => Array ( [id] => 34 [maxs] => 440 [occs] => 3 ) [2] => Array ( [id] => 32 [maxs] => 213 [occs] => 3 ) [3] => Array ( [id] => 99 [maxs] => 586 [occs] => 2 ) [4] => Array ( [id] => 16 [maxs] => 777 [occs] => 1 ) )

foreach( $items as $item ) $sorted_ids[] = $item['id'];
/// print_r( $sorted_ids ); // $sorted_ids holds your desired ids list. outputs: Array ( [0] => 22 [1] => 34 [2] => 32 [3] => 99 [4] => 16 )
于 2012-05-03T22:03:00.607 に答える