sort por ordenar objetos fecha campo arreglos arreglo array_multisort array php arrays sorting

objetos - PHP ordenar matriz por dos valores de campo



ordenar un arreglo de arreglos php (5)

Tengo una matriz como esta

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 return_fare asc, one_way_fare asc?

Intenté array_multisort() pero terminé obteniendo datos confusos ...

asort solo funciona para una matriz unidimensional, necesito ordenar por dos valores o más, ¿cómo puedo lograr esto como en SQL, ordenando por campo1 asc, campo2 asc?


Además de array_multisort() , que requiere que primero construya columnas-matrices, también hay 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


O puede usar uasort siguiente manera

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

Fiddle


Ohh, logré resolver mi propia pregunta nuevamente ...

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); }

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

¡más temprano!


Otro ejemplo usando el operador de nave espacial.

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


array_multisort() es la función correcta, debe haber cometido un error 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 echa un vistazo a los comentarios en la página de manual de PHP para array_multisort() , puede encontrar una función muy útil array_orderby() que le permite acortar lo anterior a solo esto:

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

Para evitar el bucle utiliza 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);