php ordenando arreglos múltiples con prioridad múltiple

Tengo N número de matrices (por ejemplo, 3 matrices):

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

    );

Quiero ordenar estas (N) matrices según (id) y (puntuación), pero quiero dar prioridad a la ocurrencia de repetición de id en todas las matrices y luego la segunda prioridad a la puntuación máxima, y ​​el resultado será (1 ) matriz única filtrada que contiene identificadores únicos de acuerdo con estas reglas de clasificación.

Intenté hacer esto usando php usort función para pasar la función de comparación pero no pude hacer el trabajo.

preguntado el 03 de mayo de 12 a las 21:05

¿Esta información proviene de una base de datos? Porque si lo es, la base de datos lo manejaría mucho más fácilmente. -

sí, esta información proviene de la base de datos porque construí una tabla de índice de búsqueda y quiero ordenar los resultados:

1 Respuestas

Si la fuente de los datos proviene de una base de datos mysql, esta ordenación personalizada se puede recuperar fácilmente con una simple consulta de sql.

Pero si debemos trabajar con las matrices directamente, esto también debería funcionar: (perdón por la codificación sucia y la poca movilidad).

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

contestado el 03 de mayo de 12 a las 23:05

Maravilloso, el código da el resultado requerido. Gracias. ¿Puede darme un ejemplo para hacer esto usando la base de datos? - semsem

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.