2010-08-06 42 views
5

Tengo la siguiente matriz. Necesito clasificar esta matriz por la matriz anidada tecla [id]:PHP ordenar matrices multidimensionales

Array ( 
[0] => Array ([id] => 5 [category_id] => 12) 
[1] => Array ([id] => 3 [category_id] => 12) 
[2] => Array ([id] => 9 [category_id] => 12) 
[3] => Array ([id] => 4 [category_id] => 12) 
) 
+0

duplicados de http://stackoverflow.com/questions/3376607/help-sorting-this-array/3376735 # 3376735 – stillstanding

Respuesta

2

puede hacerlo de esta manera

foreach($arr as $val) { 
    $ret[$val['id']] = $val['category_id']; 
} 
ksort($ret); 

en caso de que desee obtener la misma matriz ordenada entonces se puede añadir el siguiente código:

foreach($ret as $key=>$val) { 
    $newArr[] = array('id'=>$key,'category_id'=>$val); 
} 
0

tratar array_multisort va a ordenar la matriz externa por la primera clave/propiedad de los arreglos interiores

0
function sort_by_field($field, & $data) { 
    $sort_func = create_function('$a,$b', 'if ($a["' . $field . '"] == $b["' . $field . '"]) {return 0;} 
      return ($a["' . $field . '"] < $b["' . $field . '"]) ? -1 : 1;'); 

    uasort($data, $sort_func); 
} 
8

Uso usort con una función de comparación personalizada.

<?php 

function cmp($a, $b) { 
    if ($a['id'] == $b['id']) 
    return 0; 
    return $a['id'] < $b['id'] ? -1 : 1; 
} 

$array = Array ( 
    0 => Array ('id' => 5, 'category_id' => 12), 
    1 => Array ('id' => 4, 'category_id' => 12), 
    2 => Array ('id' => 7, 'category_id' => 12), 
    3 => Array ('id' => 3, 'category_id' => 12), 
); 

usort($array, 'cmp'); 

// Output: 3 4 5 7 
foreach ($array as $element) 
    echo $element['id'], " "; 
+0

+1 una buena solución universal. – Centurion

+0

Usted podría simplemente devolver '$ a ['id'] - $ b ['id']' en la función 'cmp'. – Artefacto

1

¿Por qué no simplemente almacenar sus datos como este?

Array ( 
    [5] => int(12) 
    [3] => int(12) 
    [9] => int(12) 
    [4] => int(12) 
) 

Entonces puede simplemente usar ksort() como de costumbre.

+1

Así es como hago arreglos en los que solo necesito asignar dos números. Puede que no sea tan explícito, pero hace que trabajar con él sea mucho más fácil. – tj111

Cuestiones relacionadas