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);
Muchas gracias, funciona a la perfección, gracias José!
Que buena onda!!
si funciono.
Me salvaste la vida josé!
Excelente. Muchas gracias, era justo lo que buscaba.
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
)
)
Hola,
Si, puedes emplear la técnica implícita en este tutorial.
Saludos
Muchas Gracias
me sirvio
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;
}
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
Excelente gracias
WOWWWW MAESTRASSOOO, en realidad me sirvió. Eres grande
Muchísimas gracias por el aporte. DE verdad era lo que estaba buscando. No puedo decir mas que mis mas sicneros agradecimentos
Gracias. Simple y concreto. Me funcionó perfectamente
Muchas gracias 😉
Muchas gracias
Gracias, me evitaste varias lineas de código 🙂
Eres el puto amo y .
Muy buen aporte con ejemplo, me ha servido mucho, gracias
demasiado, me funciono hermano.. un abrazo. calidad calidad..!
Cara obrigado, o único exemplo na internet que deu certo.
Muy bien gracias, funciono excelente…
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
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
gracias amigo me sirvió
Mil gracias! Estaba a punto de reprogramar mucho código!
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);
}
Excelente aporte amigo, Gracias por tus aportes.!!!
buen ejemplo, me ha servido mucho, habia visto el ejemplo en el manual de PHP pero esta más claro aqui!
Saludos y Gracias!
Es cierto, el ejemplo de la pagina de php no esta tan claro como el de esta pagina, gracias a mi igual me ayudo.