2012-05-03 30 views
1

我有阵列的N个(例如3个阵列。):PHP排序多阵列具有多优先

$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) 

    ); 

我想取决于(ID)和(分数),但我这些(N)阵列排序希望优先考虑所有数组中的重复id事件,然后优先考虑最大分数,结果将是(1)根据这些排序规则,过滤唯一数组,其中包含唯一标识符。

我试图做到这一点使用php usort函数来传递比较函数,但我没有做到这一工作。

+1

这个信息从数据库中来吗?因为如果是这样的话,数据库可以更轻松地处理这个问题。 –

+0

是的,这个信息来自数据库,因为我建立搜索索引表并想对结果进行排序 – semsem

回答

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) 
+1

精彩的代码给出了所需的结果 谢谢 请你可以举个例子来做这个使用数据库吗? – semsem