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