2010-04-23 20 views
6

He escrito una secuencia de comandos para producir una matriz de datos, pero ahora quiero mostrar en orden de puntuación. El conjunto de salidas de la siguiente manera;Cómo ordenar matrices múltiples en PHP

[display_name] => Array 
    (
     [0] => ACT_Web_Designs 
     [1] => user1_design 
     [2] => user2_design 
    ) 

[proffesion] => Array 
    (
     [0] => Web Developer 
     [1] => web developer 
     [2] => Web Developer 
    ) 

[score] => Array 
    (
     [0] => 15 
     [1] => 6 
     [2] => 15 
    ) 

[img] => Array 
    (
     [0] => ./?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic 
     [1] => 
     [2] => 
    ) 

Así que, en pocas palabras, quiero que se convierta de la siguiente manera;

[display_name] => Array 
    (
     [0] => ACT_Web_Designs 
     [1] => user2_design 
     [2] => user1_design 
    ) 

[proffesion] => Array 
    (
     [0] => Web Developer 
     [1] => web developer 
     [2] => Web Developer 
    ) 

[score] => Array 
    (
     [0] => 15 
     [1] => 15 
     [2] => 6 
    ) 

[img] => Array 
    (
     [0] => ./?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic 
     [1] => 
     [2] => 
    ) 

He estado buscando asort() pero no puedo hacer que nada funcione. cualquier ayuda sería muy apreciada.

+1

son los datos de una base de datos? ¿Tal vez puede ordenar los datos antes de ponerlos en una matriz? – Hanseh

+0

Sí, los resultados son solo para un directorio/motor de búsqueda, por lo que los resultados se basan en la forma más eficiente de obtener los resultados relevantes de la consulta –

+0

Es * profesión * con una * f * pero dos * s *. – Gumbo

Respuesta

6

Esto es exactamente donde el PHP 's array_multisort trata de usar. Es un caso en el que desea ordenar muchas matrices en función de la comparación que ocurre en una de ellas.

He modificado la matriz score para tener distintos valores.

<?php 

$arr = array(
       'display_name' => array('ACT_Web_Designs','user1_design','user2_design'), 
       'proffesion' => array('Web Developer','web developer','web developer'), 
       'score' => array(12,6,15), 
       'img' => array('./?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic','','') 
      ); 

var_dump($arr); 
array_multisort($arr['score'], SORT_ASC, SORT_NUMERIC, 
       $arr['display_name'], 
       $arr['proffesion'], 
       $arr['img'] 
       ); 
var_dump($arr); 


?> 

Here goes a working demo.

+0

¿Alguna vez has tenido la sensación de que PHP tiene demasiadas funciones de clasificación? Todo lo que necesitas hacer es encontrar el correcto y todos tus problemas desaparecerán. Aprendí una nueva hoy, gracias. –

+0

@Christian: de acuerdo, hay muchas funciones de clasificación. Cada uno es para un cierto problema para resolver. Es bueno que no tengamos que escribir nuestra propia función de ordenación la mayoría de las veces. – codaddict

0

¿No funciona solo rsort la matriz de puntuación?

rsort($data['score'], SORT_NUMERIC); 
+0

no, solo la matriz de puntuación. –

0

He logrado hacer esto, estaba justo después de una manera más eficiente;

$array = array(
      'display_name' => array(0 => 'ACT_Web_Designs', 1 => 'user1_design', 2 => 'user2_design'), 
      'proffesion' => array(0 => 'Web Developer', 1 => 'web developer', 2 => 'Web Developer'), 
      'score' => array(0 => 15, 1 => 6, 2 => 15), 
      'img' => array(0 => './?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic', 1 => '', 2 => '') 
); 

arsort($array['score'], SORT_NUMERIC); 
foreach($array['score'] as $key => $val) { 
    $newarray['display_name'][] = $array['display_name'][$key]; 
    $newarray['proffesion'][] = $array['proffesion'][$key]; 
    $newarray['score'][] = $array['score'][$key]; 
    $newarray['img'][] = $array['img'][$key]; 
} 

print_r($newarray); 

vuelve

Array 
(
    [display_name] => Array 
     (
      [0] => ACT_Web_Designs 
      [1] => user2_design 
      [2] => user1_design 
     ) 

    [proffesion] => Array 
     (
      [0] => Web Developer 
      [1] => Web Developer 
      [2] => web developer 
     ) 

    [score] => Array 
     (
      [0] => 15 
      [1] => 15 
      [2] => 6 
     ) 

    [img] => Array 
     (
      [0] => ./?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic 
      [1] => 
      [2] => 
     ) 

) 
0

Esto no va a volver a ordenar para usted, pero le dejará ir a través de ellos en el orden que desee. Puede reasignarlos si lo desea, pero yo solo usaría esto para la orden de salida.

Editar: Esto no funcionará, debido a la posibilidad de valores clave no únicos. Ver comentarios a continuación, y aprender de mi error

$sort_order = $array['score']; 
arsort($sort_order); 
$sort_order = array_flip($sort_order); 
foreach($sort_order as $key){ 
    echo $array['display_name'][$key].' - '.$array['score'][$key]; 
}
+0

¡Tuvimos la misma idea! Sin embargo, se encontró con un problema al usar array_flip porque no se garantiza que los puntajes sean únicos. Ver mi respuesta para mi variación. – erisco

+0

Ah, veo el problema. Gracias por enderezarme;) –

1

¿Qué tal esto más simple

$arr = array("k"=>array("A","B","C"),"l"=>array(15,6,15),"n"=>array("k","l","n")); 
array_multisort($arr["k"],SORT_NUMERIC,SORT_DESC,$arr["l"],$arr["n"]); 
var_dump($arr); 
0

Uso rsort()

<?php 
$fruits = array("lemon", "orange", "banana", "apple"); 
rsort($fruits); 
reset($fruits); 
while (list($key, $val) = each($fruits)) { 
    echo "$key = $val\n"; 
} 
?> 

del ejemplo seria:

0 = orange 
1 = lemon 
2 = banana 
3 = apple 
0

La solución más elegante que pude encontrar no reordenaría la estructura de datos, sino que meramente accedería a ella de una manera diferente.

$scores = $data['score']; 
arsort($scores); 
$keys_ordered_by_score = array_keys($scores); 

Ahora puede, por ejemplo, agarrar el display_name y "proffesion" que tiene la puntuación más alta por lo siguiente:

$first_place = $keys_ordered_by_score[0]; 
echo $data['display_name'][$first_place], 
    ' is a ', $data['proffesion'][$first_place]; 

Por supuesto, si realmente necesita para reordenar la estructura de datos , esta idea es inútil para ti. Cualquiera de las otras respuestas que usan array_multisort() probablemente se adaptará a esa necesidad.

Cuestiones relacionadas