¿Alguien sabe cómo ordenar correctamente esta matriz por versión preservando las sub-matrices?

He visto problemas y soluciones similares en stackoverflow pero no puedo aplicar a mi matriz.

Gracias de antemano

array (size=3)
  '1.23.006' => 
    array (size=1)
      0 => string '1' (length=1)
  '2.0.0' => 
    array (size=1)
      0 => string '1' (length=1)
  '10.0.0' => 
    array (size=2)
      0 => string '1' (length=1)
      1 => string '4' (length=1)

Quiero que se ordene así:

array (size=3)
  '10.0.0' => 
    array (size=2)
      0 => string '1' (length=1)
      1 => string '4' (length=1)
  '2.0.0' => 
    array (size=1)
      0 => string '1' (length=1)
  '1.23.006' => 
    array (size=1)
      0 => string '1' (length=1)
0
Fabián Fernández 24 ago. 2020 a las 06:05

1 respuesta

La mejor respuesta

Debes usar uksort para ordenar tu matriz por claves, con una función personalizada que llama a version_compare para compararlos:

$data = array('1.23.006' => array('1'), '2.0.0' => array('1'), '10.0.0' => array('1', '4'));

uksort($data, function ($a, $b) {
    return version_compare($b, $a);
});

print_r($data);

Salida:

Array
(
    [10.0.0] => Array
        (
            [0] => 1
            [1] => 4
        )
    [2.0.0] => Array
        (
            [0] => 1
        )
    [1.23.006] => Array
        (
            [0] => 1
        )
)

Demostración en 3v4l.org

0
Nick 24 ago. 2020 a las 04:19