Aviram
Tengo una matriz como:
$array = [
'DEF' => [
['type' => 1, 'id' => 1212, 'name' => 'Jane Doe', 'current' => 1],
['type' => 1, 'id' => 3123121, 'name' => 'Door', 'current' => null],
],
'ABC' => [
['type' => 1, 'id' => 1234, 'name' => 'John Doe', 'current' => null],
],
'WW' => [
['type' => 1, 'id' => 1212, 'name' => 'Jane Doe', 'current' => 1],
['type' => 1, 'id' => 3123121, 'name' => 'Door', 'current' => null],
['type' => 1, 'id' => 64646, 'name' => 'Floor', 'current' => null],
]
];
Y quiero ordenar esta matriz por número ( count() ) de elementos de matriz interna descendentes (es decir, la mayoría de los elementos primero), así que tendré esta matriz:
[
'WW' => [
['type' => 1, 'id' => 1212, 'name' => 'Jane Doe', 'current' => 1],
['type' => 1, 'id' => 3123121, 'name' => 'Door', 'current' => null],
['type' => 1, 'id' => 64646, 'name' => 'Floor', 'current' => null],
],
'DEF' => [
['type' => 1, 'id' => 1212, 'name' => 'Jane Doe', 'current' => 1],
['type' => 1, 'id' => 3123121, 'name' => 'Door', 'current' => null],
],
'ABC' => [
['type' => 1, 'id' => 1234, 'name' => 'John Doe', 'current' => null],
]
];
¿Alguien puede sugerir una manera eficiente de hacerlo? Gracias.
Arnaud LeBlanc
Usando uksort
:
uksort($array, function($a, $b) { return count($b) - count($a); });
Usando array_multisort
:
array_multisort(array_map('count', $array), SORT_DESC, $array);
Con PHP
function sort_cb($a, $b) {
return count($b) - count($a);
}
uksort($array, 'sort_cb');
-
Si está utilizando PHP
– NullUserException
15 de septiembre de 2011 a las 15:47
-
no deberías usar PHP
–Arnaud Le Blanc
15/09/2011 a las 15:50
-
El ejemplo de uksort() no funcionó porque perdí mis claves de matriz (‘ABC’, ‘DEF’, ‘WW’) pero array_multisort() funcionó, ¡gracias!
– Aviram
15 de septiembre de 2011 a las 15:54
-
uksort
ordena por claves. Las claves no pueden ser matrices y count no cuenta nada.usort
compara valores, que pueden ser matrices.– Grzegorz
11 mayo 2018 a las 11:15
<?php
function cmp($a, $b)
{
if ($a == $b) {
return 0;
}
return (count($a) > count($b)) ? -1 : 1;
}
$a = array(
"AA" => array(
array('type'=>'1', 'id'=>'2'),
array('type'=>'2', 'id'=>'2')),
'BB' => array(
array('type'=>'1', 'id'=>'2'),
array('type'=>'2', 'id'=>'2'),
array('type'=>'5', 'id'=>'2')),
'CC' => array(
array('type'=>'1', 'id'=>'2'))
);
usort($a, "cmp");
print_r($a);
?>
-
Si usa PHP 7, ahora puede simplemente hacer
count($a) <=> count($b)
; 🙂– galdikas
19 de julio de 2017 a las 5:53
-
Esto era exactamente lo que necesitaba, gracias.
– Aarón
9 de junio de 2021 a las 7:35
$tempArr = $sortedArr = array();
foreach ($myArr as $k => $v) $tempArr[$k] = count($v);
asort($tempArr);
foreach ($tempArr as $k => $v) $sortedArr = $myArr[$k];
Tenga en cuenta que esto se romperá si alguno de los valores de la matriz no son matrices en sí mismos, es posible que desee agregar un is_array()
comprobar en algún lugar…
Si solo le preocupa ordenar por tamaño y no por la calidad real, puede usar el enfoque más simple para ordenar de forma descendente y preservar las claves con arsort()
.
En el caso de que tenga varias filas con el mismo tamaño, se ordenarán de forma descendente en función de sus datos reales.
Código: (Manifestación)
arsort($array);
var_export($array);
Por que no
usort
php.net/manual/en/function.usort.php ?– Joseph Silber
15 de septiembre de 2011 a las 15:42
utilice var_export para volcar matrices
–Arnaud Le Blanc
15 de septiembre de 2011 a las 15:46