2011-03-14 9 views
6

tengo esta matrizordenar una matriz multidimensional utilizando array_multisort

Array 
(
    [0] => Array 
     (
      [brand] => blah blah 
      [location] => blah blah 
      [address] => blah blah 
      [city] => blah blah 
      [state] => CA 
      [zip] => 90210 
      [country] => USA 
      [phone] => 555-1212 
      [long] => -111 
      [lat] => 34 
      [distance] => 3.08 
     ) 
    [1] => Array 
     (
      [brand] => blah blah 
      [location] => blah blah 
      [address] => blah blah 
      [city] => blah blah 
      [state] => CA 
      [zip] => 90210 
      [country] => USA 
      [phone] => 555-1212 
      [long] => -111 
      [lat] => 34 
      [distance] => 5 
     ) 
. 
. 
. 

} 

Quiero ser capaz de ordenar las matrices en el hash de la distancia. ¡AYUDA! Muchas gracias

+0

array_multisort está al revés: ordena una matriz de columnas. (De hecho, ordena múltiples matrices independientes que representan columnas). Esto casi nunca es lo que desea: transponga su matriz o use algo útil como la conexión. – aib

Respuesta

18

Primero debe extraer todas las distancias y luego pasar la distancia y los datos a la función. Como se muestra en el ejemplo 3 en la documentación array_multisort.

foreach ($data as $key => $row) { 
    $distance[$key] = $row['distance']; 
} 

array_multisort($distance, SORT_ASC, $data); 

Esto supone que desea las distancias más cortas en primer lugar, de lo contrario cambiar el SORT_ASC-SORT_DESC

2

Uso puede utilizar usort;

function cmpDistance($a, $b) { 
    return ($a['distance'] - $b['distance']); 
} 

usort($array, "cmpDistance"); 
+0

La razón por la que muchas funciones de comparación devuelven el número positivo/negativo en lugar de explícitamente -1 y 1 es para simplificar funciones como esta. El cuerpo de la función puede ser 'return $ a ['distance'] - $ b ['distance']' – Jacob

+0

¿por qué obtengo un "Fatal error: Can redeclare cmp()"? Estoy confundido – dst11

+0

@Jacob, tienes razón, he actualizado el código. ¡Gracias! – Czechnology

1

Si desea evitar el bucle, puede utilizar la función array_column para lograr su objetivo. por ejemplo,

que desea ordenar por debajo de matriz con distancia clasificar

$arr = array(0 => array('lat' => 34,'distance' => 332.08),1 => Array('lat' => 34,'distance' => 5),2 => Array('lat' => 34,'distance' => 34));

mediante el siguiente sola línea de la matriz será ordenar por distancia

array_multisort(array_column($arr, 'distance'), SORT_ASC,SORT_NUMERIC,$arr);

Ahora, $ arr contienen ordenados array por distancia

Cuestiones relacionadas