Ordene una matriz multidimensional de forma descendente por número de subarreglos y conserve las claves de primer nivel

1 minuto de lectura

Avatar de usuario de Aviram
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.

  • 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

Avatar de usuario de Arnaud Le Blanc
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

  • ¿No debería ser así? usort en vez de ordenar?

    – Hirnhamster

    26 de agosto de 2014 a las 14:33

  • 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().

La matriz con menos miembros es más pequeña, si la clave del operando 1 no se encuentra en el operando 2, las matrices son incomparables; de lo contrario, compare valor por valor (consulte el siguiente ejemplo)

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);

¿Ha sido útil esta solución?