2011-01-03 15 views
46

He una serie como estaPHP matriz ordenar por dos campos valora

 
Array (
[0] => Array("destination" => "Sydney", 
       "airlines" => "airline_1", 
       "one_way_fare" => 100, 
       "return_fare => 300 
     ), 
[2] => Array("destination" => "Sydney", 
       "airlines" => "airline_2", 
       "one_way_fare" => 150, 
       "return_fare => 350 
     ), 
[3] => Array("destination" => "Sydney", 
       "airlines" => "airline_3", 
       "one_way_fare" => 180, 
       "return_fare => 380 
     ) 
) 

¿Cómo puedo ordenar el valor por asc return_fare, one_way_fare asc?

me trataron array_multisort() pero que terminó siendo de datos mezclados ..

asort sólo funciona para una matriz unidimensional, lo que necesito para ordenar por dos o más valores, ¿cómo puedo lograr esto al igual que en SQL, por fin field1 asc, field2 asc?

Respuesta

73

array_multisort() es la función correcta, debe tener en mal estado de alguna manera:

// Obtain a list of columns 
foreach ($data as $key => $row) { 
    $return_fare[$key] = $row['return_fare']; 
    $one_way_fare[$key] = $row['one_way_fare']; 
} 

// Sort the data with volume descending, edition ascending 
array_multisort($return_fare, SORT_ASC, $one_way_fare, SORT_ASC, $data); 

Si se echa un vistazo a los comentarios en la página del manual de PHP para array_multisort(), usted puede encontrar una función muy útil array_orderby() que le permite para acortar la de arriba para esto:

$sorted = array_orderby($data, 'return_fare', SORT_ASC, 'one_way_fare', SORT_ASC); 

para evitar el uso de bucle array_column() (a partir de PHP 5.5.0):

array_multisort(array_column($data, 'return_fare'), SORT_ASC, 
       array_column($data, 'one_way_fare'), SORT_ASC, 
       $data); 
+0

gracias ..! Creo que lo hice exactamente igual. no puede encontrar la función array_orderby() en los comentarios de la página manual – flyclassic

+2

@flyclassic, el primer comentario: http://www.php.net/manual/en/function.array-multisort.php#100534 –

+0

gracias .. ahora lo veo .. – flyclassic

1

Ohh, he conseguido resolver mi propia pregunta de nuevo ....

function array_multi_sort($array, $on1,$on2, $order=SORT_ASC) 
{ 

    foreach($array as $key=>$value){ 
     $one_way_fares[$key] = $value[$on2]; 
     $return_fares[$key] = $value[$on1]; 
    } 

    array_multisort($return_fares,$order,$one_way_fares,$order,$array); 
} 

la cosa es que perdí el array $ último parámetro en array_multisort($return_fares,$order,$one_way_fares,$order,$array);

antes!

27

Además de array_multisort(), que requiere que primero genere matrices de columnas, también existe usort() que no requiere tal cosa.

usort($data, function($a, $b) { 
    $rdiff = $a['return_fare'] - $b['return_fare']; 
    if ($rdiff) return $rdiff; 
    return $a['one_way_fare'] - $b['one_way_fare']; 
}); // anonymous function requires PHP 5.3 - use "normal" function earlier 
+7

O más en breve, 'return $ a ['return_fare'] - $ b ['return_fare']?: A ['one_way_fare'] - $ b ['one_way_fare'];' Todo se siente más natural que 'array_multisort()' –

9

O puede utilizar de la siguiente manera uasort

uasort($arr, function($a,$b){ 
    $c = $a['return_fare'] - $b['return_fare']; 
    $c .= $a['one_way_fare'] - $b['one_way_fare']; 
    return $c; 
}); 

Fiddle

+0

Fiddle da error. – horse

+0

@ user2356198 qué error estaba recibiendo.¿Puede decirme por favor que funciona bien para mí? –

+0

Está bien ahora, simplemente no seleccioné el compilador correcto. – horse

3

Otro ejemplo usando el operador de la nave espacial.

usort($data, function($a, $b) { 
    return $a['return_fare'] <=> $b['return_fare'] ?: $a['one_way_fare'] <=> $b['one_way_fare'] 
}); 
Cuestiones relacionadas