Ordenar array multidimensional en base a un campo

Podría darse el caso de que estemos trabajando con una infinidad de datos guardadas en un array multidimensional o vector y queramos ordenarlos según un campo.

En PHP disponemos de una función muy útil para estos casos. Estamos hablando de array_multisort() que se trata de una función que puede usarse para ordenar varios arrays al mismo tiempo, o un array multi-dimensional por una o más dimensiones.

Vamos a explicar su funcionamiento ilustrando un ejemplo. Lo primero que haremos será construir un array bidimensional de elementos. En este ejemplo vamos a guardar en el array usuarios, donde los campos serán: «name» y «age» de forma desordenada observando el campo «age».

$users[] = array('name' => 'Sergio', 'age' => 22);
$users[] = array('name' => 'Carlos', 'age' => 29);
$users[] = array('name' => 'Iván', 'age' => 24);
$users[] = array('name' => 'Jorge', 'age' => 21);
$users[] = array('name' => 'Dani', 'age' => 25);
$users[] = array('name' => 'Jose', 'age' => 27);
$users[] = array('name' => 'David', 'age' => 19);
$users[] = array('name' => 'Esteban', 'age' => 35);

Seguidamente generamos un vector o array de claves que guardamos en la variable auxiliar $aux. Si nos fijamos, estamos guardando todas las edades.

foreach ($users as $key => $row) {
    $aux[$key] = $row['age'];
}

Una vez hemos contruido el array de edades, procedemos a llamar a la función array_multisort() con los 3 parámetros que podemos observar.

array_multisort($aux, SORT_ASC, $users);

Como primer parámetro le estamos pasando el vector de claves donde tenemos todas las edades, el segundo parámetro es para indicar la forma de ordenació; ascendente o descendente y por último incorporamos el vector a ordenar.

Finalmente, obtendremos el array $users ordenado. Lo podemos ver de la siguiente forma:

foreach ($users as $key => $row) {
    echo $row['name'].' '.$row['age'].'<br/>';
}

Obteniéndose como resultado lo siguiente:

David 19
Jorge 21
Sergio 22
Iván 24
Dani 25
Jose 27
Carlos 29
Esteban 35

O también lo podemos ver utilizando lo siguiente:

print_r($users);

Ver el ejemplo en funcionamiento

Autor
Escrito por Jose Aguilar - Director ejecutivo y tecnológico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.
Te ha servido? Valora esta entrada!
(22 votos, promedio: 5 de 5)
Comparte en las redes sociales
¿Buscas trabajo de programador?

29 respuestas a “Ordenar array multidimensional en base a un campo”

  1. Muchas gracias, funciona a la perfección, gracias José!

  2. Javier dice:

    Que buena onda!!
    si funciono.

  3. Martín dice:

    Me salvaste la vida josé!

  4. Carlos Vega dice:

    Excelente. Muchas gracias, era justo lo que buscaba.

  5. Nando dice:

    hay alguna forma de ordenar este array ???

    Array
    (
    [id_referencia_movimiento_c25] => Array
    (
    [1] => A125000000195
    [2] => A125000000206
    [3] => A125000000212
    [4] => A125000000221
    [5] => A125000000236
    [6] => A125000000243
    [7] => A125000000251
    )

    [idd_referencia_venta_compra_c25] => Array
    (
    [1] => A111000000043
    [2] => A111000000043
    [3] => A111000000043
    [4] => A111000000043
    [5] => A111000000043
    [6] => A111000000043
    [7] => A111000000052
    )

    [referencia_cliente_proveedor_c25] => Array
    (
    [1] => CF
    [2] => CF
    [3] => CF
    [4] => CF
    [5] => CF
    [6] => CF
    [7] => CF
    )

    [operacion_codigo_c25] => Array
    (
    [1] => VF
    [2] => VF
    [3] => VF
    [4] => VF
    [5] => VF
    [6] => VF
    [7] => VR
    )

    [activo_son_c25] => Array
    (
    [1] => S
    [2] => S
    [3] => S
    [4] => S
    [5] => S
    [6] => S
    [7] => S
    )

    [sucursal_c25] => Array
    (
    [1] => 1
    [2] => 1
    [3] => 1
    [4] => 1
    [5] => 1
    [6] => 1
    [7] => 1
    )

    [comprobante_venta_compra_c25] => Array
    (
    [1] => 00000004
    [2] => 00000004
    [3] => 00000004
    [4] => 00000004
    [5] => 00000004
    [6] => 00000004
    [7] => 00000001
    )

    [referencia_pago_c25] => Array
    (
    [1] => CH
    [2] => BS
    [3] => BS
    [4] => BS
    [5] => BS
    [6] => BS
    [7] => CH
    )

    [tipo_pago_c25] => Array
    (
    [1] => H
    [2] => B
    [3] => B
    [4] => B
    [5] => B
    [6] => B
    [7] => H
    )

    [orden_dia_n25] => Array
    (
    [1] => 99
    [2] => 99
    [3] => 99
    [4] => 99
    [5] => 99
    [6] => 99
    [7] => 99
    )

    [comprobante_fecha_i_c25] => Array
    (
    [1] => 20190703
    [2] => 20190703
    [3] => 20190803
    [4] => 20190903
    [5] => 20191003
    [6] => 20191103
    [7] => 20190703
    )

    [comprobante_c25] => Array
    (
    [1] =>
    [2] => 1313
    [3] => 1313
    [4] => 1313
    [5] => 1313
    [6] => 1313
    [7] =>
    )

    [comprobante_importe_n25] => Array
    (
    [0] => 1.00
    [1] => 1.00
    [2] => 1.00
    [3] => 1.00
    [4] => 1.00
    [5] => 5.00
    [6] => 100.00
    )

    [saldo_importe_n25] => Array
    (
    [1] => 0.00
    [2] => 0.00
    [3] => 0.00
    [4] => 0.00
    [5] => 0.00
    [6] => 0.00
    [7] => 0.00
    )

    [confirmado_son_c25] => Array
    (
    [1] => N
    [2] => N
    [3] => N
    [4] => N
    [5] => N
    [6] => N
    [7] => N
    )

    [observacion_c25] => Array
    (
    [1] =>
    [2] =>
    [3] =>
    [4] =>
    [5] =>
    [6] =>
    [7] =>
    )

    [modificausuario_c25] => Array
    (
    [1] =>
    [2] =>
    [3] =>
    [4] =>
    [5] =>
    [6] =>
    [7] =>
    )

    [modificafechor_c25] => Array
    (
    [1] =>
    [2] =>
    [3] =>
    [4] =>
    [5] =>
    [6] =>
    [7] =>
    )

    [altausuario_c25] => Array
    (
    [1] => NANDO
    [2] => NANDO
    [3] => NANDO
    [4] => NANDO
    [5] => NANDO
    [6] => NANDO
    [7] => NANDO
    )

    [altafechor_c25] => Array
    (
    [1] => 20190703130608
    [2] => 20190703130608
    [3] => 20190703130608
    [4] => 20190703130608
    [5] => 20190703130608
    [6] => 20190703130608
    [7] => 20190703130631
    )

    )

  6. Miguel dice:

    Muchas Gracias
    me sirvio

  7. mikiy dice:

    hola me podrías ayudar tengo que ordenar este array por mayor a menor por costo de compra… utilizando uasort … pero e intentado varias veces y no me sale .. gracias..
    function productoMayorCosto (){
    $prodMayorCosto = array();
    $prodMayorCosto[0] = [«producto «=> «barby», «precioPord»=>1035.50,»cantidadProducto»=>10];//enero
    $prodMayorCosto[1] = [«producto «=> «peluche tedy», «precioPord»=>680.00,»cantidadProducto»=>30];//febrero
    $prodMayorCosto[2] = [«producto «=> «pista speed racer tubes», «precioPord»=>1499.94,»cantidadProducto»=>20];//marzo
    $prodMayorCosto[3] = [«producto «=> «muñeca baby lila», «precioPord»=>349.93,»cantidadProducto»=>33];//abril
    $prodMayorCosto[4] = [«producto «=> «perro puppy dog modelo 11», «precioPord»=>1679.93,»cantidadProducto»=>5];//mayo
    $prodMayorCosto[5] = [«producto «=> «ditoys costructor «, «precioPord»=>599.94,»cantidadProducto»=>40];//junio
    $prodMayorCosto[6] = [«producto «=> «paquete 10 hot wheels», «precioPord»=>799.00,»cantidadProducto»=>15];//julio
    $prodMayorCosto[7] = [«producto «=> «lanza pelotas «, «precioPord»=>699.00,»cantidadProducto»=>25];//agosto
    $prodMayorCosto[8] = [«producto «=> «dinosaurio», «precioPord»=>1399.00,»cantidadProducto»=>30];//septiembre
    $prodMayorCosto[9] = [«producto «=> «valija mini taller «, «precioPord»=>625.0,»cantidadProducto»=>15];//octubre
    $prodMayorCosto[10] = [«producto «=> «osos escandalosos», «precioPord»=>399.25,»cantidadProducto»=>45];//noviembre
    $prodMayorCosto[11] = [«producto «=> «unirconio Poni», «precioPord»=>1035.50,»cantidadProducto»=>10];//diciembre

    return $prodMayorCosto;
    }

    • Jose Aguilar dice:

      Hola,

      Prueba implementar el código que hay en este tutorial justo antes del return de tu función pero adaptándolo a tus necesidades. Debería retornar el array ordenado. Algo así podrías agregar ahí:

      function productoMayorCosto (){
      $prodMayorCosto = array();
      $prodMayorCosto[0] = [“producto “=> “barby”, “precioPord”=>1035.50,”cantidadProducto”=>10];//enero
      $prodMayorCosto[1] = [“producto “=> “peluche tedy”, “precioPord”=>680.00,”cantidadProducto”=>30];//febrero
      $prodMayorCosto[2] = [“producto “=> “pista speed racer tubes”, “precioPord”=>1499.94,”cantidadProducto”=>20];//marzo
      $prodMayorCosto[3] = [“producto “=> “muñeca baby lila”, “precioPord”=>349.93,”cantidadProducto”=>33];//abril
      $prodMayorCosto[4] = [“producto “=> “perro puppy dog modelo 11”, “precioPord”=>1679.93,”cantidadProducto”=>5];//mayo
      $prodMayorCosto[5] = [“producto “=> “ditoys costructor “, “precioPord”=>599.94,”cantidadProducto”=>40];//junio
      $prodMayorCosto[6] = [“producto “=> “paquete 10 hot wheels”, “precioPord”=>799.00,”cantidadProducto”=>15];//julio
      $prodMayorCosto[7] = [“producto “=> “lanza pelotas “, “precioPord”=>699.00,”cantidadProducto”=>25];//agosto
      $prodMayorCosto[8] = [“producto “=> “dinosaurio”, “precioPord”=>1399.00,”cantidadProducto”=>30];//septiembre
      $prodMayorCosto[9] = [“producto “=> “valija mini taller “, “precioPord”=>625.0,”cantidadProducto”=>15];//octubre
      $prodMayorCosto[10] = [“producto “=> “osos escandalosos”, “precioPord”=>399.25,”cantidadProducto”=>45];//noviembre
      $prodMayorCosto[11] = [“producto “=> “unirconio Poni”, “precioPord”=>1035.50,”cantidadProducto”=>10];//diciembre

      foreach ($prodMayorCosto as $key => $row) {
      $aux[$key] = $row[‘precioPord’];
      }

      array_multisort($aux, SORT_DESC, $prodMayorCosto);

      return $prodMayorCosto;
      }

      Saludos

  8. Seguis dice:

    Excelente gracias

  9. Jesus i dice:

    WOWWWW MAESTRASSOOO, en realidad me sirvió. Eres grande

  10. Juan Joya dice:

    Muchísimas gracias por el aporte. DE verdad era lo que estaba buscando. No puedo decir mas que mis mas sicneros agradecimentos

  11. Luis Alvarez-Maza dice:

    Gracias. Simple y concreto. Me funcionó perfectamente

  12. Max dice:

    Muchas gracias 😉

  13. Fernan dice:

    Muchas gracias

  14. Santillan dice:

    Gracias, me evitaste varias lineas de código 🙂

  15. alex dice:

    Eres el puto amo y .

  16. Enrique dice:

    Muy buen aporte con ejemplo, me ha servido mucho, gracias

  17. demasiado, me funciono hermano.. un abrazo. calidad calidad..!

  18. Osmair coelho dice:

    Cara obrigado, o único exemplo na internet que deu certo.

  19. JHON BURGOS dice:

    Muy bien gracias, funciono excelente…

  20. ismael dice:

    hola AYUDAA yo tengo este array

    $discos=array (
    array(«POR LA BOCA VIVE EL PEZ»,»FITO Y FITIPALDIS»,»DRO»,»2006″),
    array(«AMAR ES COMBATIR»,»MANA»,»WARNER»,»2006″),
    array(«MI SANGRE»,»JUANES»,»UNIVERSAL MUSIC LATINO»,»2005″),
    array(«VOCES DE ULTRATUMBA»,»ESTOPA»,»SONYBMG»,»2005″),
    array(«1967-1970(BLUE ALBUM)»,»THE BEATLES»,»CAPITOL»,»1993″),
    array(«A BIGGER BANG»,»THE ROLLINGS STONES»,»EMI»,»2005″)
    );

    yl que queria es ordenar por titulo osea la primera posicion de cada array
    y despues mostrar la la informacion ordenada alfabeticamente cada array es (un ) una linea dentro de una tabla

    porfabor ayuda
    gracias

    • Jose Aguilar dice:

      Hola, en tu caso veo que tendrás que intentar ordernar por indice. No se cual es el nombre en tu array pero los indices son 0,1,2,3

      Saludos

  21. Esteban dice:

    gracias amigo me sirvió

  22. Daniela dice:

    Mil gracias! Estaba a punto de reprogramar mucho código!

  23. rah dice:

    Gacias por el dato.


    function array_multisort_by(&$array, $by, $sort = SORT_ASC){
    foreach($array as $key => $row){
    $tmp[$key] = $row[$by];
    }
    array_multisort($tmp, $sort, $array);
    }

  24. salf dice:

    Excelente aporte amigo, Gracias por tus aportes.!!!

  25. nicosli dice:

    buen ejemplo, me ha servido mucho, habia visto el ejemplo en el manual de PHP pero esta más claro aqui!

    Saludos y Gracias!

    • yadira dice:

      Es cierto, el ejemplo de la pagina de php no esta tan claro como el de esta pagina, gracias a mi igual me ayudo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Ver más sobre