Sorting all elements of a multidimensional array

2

I need to sort the array below in alphabetical order using the numeric key:

Array
(
    [AM] => Array
        (
            [1] => Array
                (
                    [localidade] => Arena da Amazonia
                    [cidade] => MANAUS
                    [estado] => Amazonia
                    [acronym] => AM
                )

            [2] => Array
                (
                    [localidade] => Ponto de Apoio
                    [cidade] => MANAUS
                    [estado] => Amazonia
                    [acronym] => AM
                )

        )

    [BA] => Array
        (
            [4] => Array
                (
                    [localidade] => Arena Fonte Nova 
                    [cidade] => SALVADOR
                    [estado] => Bahia
                    [acronym] => BA
                )

            [3] => Array
                (
                    [localidade] => Ponto de Apoio
                    [cidade] => SALVADOR
                    [estado] => Bahia
                    [acronym] => BA
                )

        )

    [DF] => Array
        (
            [7] => Array
                (
                    [localidade] => Estádio Mané Garrincha
                    [cidade] => BRASILIA
                    [estado] => Distrito Federal
                    [acronym] => DF
                )

            [8] => Array
                (
                    [localidade] => Ponto de Apoio
                    [cidade] => BRASILIA
                    [estado] => Distrito Federal
                    [acronym] => DF
                )

        )

    [MG] => Array
        (
            [10] => Array
                (
                    [localidade] => Mineirão
                    [cidade] => BELO HORIZONTE
                    [estado] => Minas Gerais
                    [acronym] => MG
                )

            [9] => Array
                (
                    [localidade] => Ponto de Apoio
                    [cidade] => BELO HORIZONTE
                    [estado] => Minas Gerais
                    [acronym] => MG
                )

            [6] => Array
                (
                    [localidade] => Estádio Mané Garrincha
                    [cidade] => BRASILIA
                    [estado] => Belo Horizonte
                    [acronym] => MG
                )

            [5] => Array
                (
                    [localidade] => Ponto de Apoio
                    [cidade] => CONFINS
                    [estado] => Belo Horizonte
                    [acronym] => MG
                )

        )

    [RJ] => Array
        (
            [24] => Array
                (
                    [localidade] => Ponto de Apoio
                    [cidade] => NITEROI
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [15] => Array
                (
                    [localidade] => Ponto de Apoio
                    [cidade] => NOVA IGUACU
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [18] => Array
                (
                    [localidade] => Barra - Centro de Golfe
                    [cidade] => RIO DE JANEIRO
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [19] => Array
                (
                    [localidade] => Barra - Parque olimpico
                    [cidade] => RIO DE JANEIRO
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [21] => Array
                (
                    [localidade] => Barra - Parque olimpico e Copacabana - Forte de Copacabana
                    [cidade] => RIO DE JANEIRO
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [17] => Array
                (
                    [localidade] => Barra - Pontal
                    [cidade] => RIO DE JANEIRO
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [20] => Array
                (
                    [localidade] => Barra - Rio Centro
                    [cidade] => RIO DE JANEIRO
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [28] => Array
                (
                    [localidade] => Barra / Copacabana e Maracanã
                    [cidade] => RIO DE JANEIRO
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [12] => Array
                (
                    [localidade] => Copacabana - Arena do Volei
                    [cidade] => RIO DE JANEIRO
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [11] => Array
                (
                    [localidade] => Copacabana - Estadio da Lagoa
                    [cidade] => RIO DE JANEIRO
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [23] => Array
                (
                    [localidade] => Copacabana - Forte de Copacabana
                    [cidade] => RIO DE JANEIRO
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [13] => Array
                (
                    [localidade] => Copacabana - marina da Glória
                    [cidade] => RIO DE JANEIRO
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [25] => Array
                (
                    [localidade] => Deodoro - Centro de Tiro / Estadio Olimpico / Centro Hoquei / Centro Aquatico / Arena da Juventude / Hipismo / Parque Radical
                    [cidade] => RIO DE JANEIRO
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [22] => Array
                (
                    [localidade] => Maracana - Estádio Olimpico
                    [cidade] => RIO DE JANEIRO
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [26] => Array
                (
                    [localidade] => Maracanã - Maracanazinho / Maracanã
                    [cidade] => RIO DE JANEIRO
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [16] => Array
                (
                    [localidade] => Maracana - Maracanazinho/Maracana
                    [cidade] => RIO DE JANEIRO
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [27] => Array
                (
                    [localidade] => Maracana - Sambodromo
                    [cidade] => RIO DE JANEIRO
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

            [14] => Array
                (
                    [localidade] => Ponto de Apoio
                    [cidade] => RIO DE JANEIRO
                    [estado] => Rio de Janeiro
                    [acronym] => RJ
                )

        )

    [SP] => Array
        (
            [30] => Array
                (
                    [localidade] => Ponto de Apoio
                    [cidade] => GUARULHOS
                    [estado] => São Paulo
                    [acronym] => SP
                )

            [29] => Array
                (
                    [localidade] => Arena Corinthians
                    [cidade] => SAO PAULO
                    [estado] => São Paulo
                    [acronym] => SP
                )

            [31] => Array
                (
                    [localidade] => Ponto de Apoio
                    [cidade] => SAO PAULO
                    [estado] => São Paulo
                    [acronym] => SP
                )

        )

)

The output should look something like this:

array (
                              'AM' => array (
                                1 => array (
                                  'cidade' => 'MANAUS',
                                  'estado' => 'Amazonia',
                                  'acronym' => 'AM',
                                  'localidade' => 'Arena da Amazonia',
                                ),
                                2 => array (
                                  'cidade' => 'MANAUS',
                                  'estado' => 'Amazonia',
                                  'acronym' => 'AM',
                                  'localidade' => 'Ponto de Apoio',
                                ),
                              ),
                              'BA' => array (
                                3 => array (
                                  'cidade' => 'SALVADOR',
                                  'estado' => 'Bahia',
                                  'acronym' => 'BA',
                                  'localidade' => 'Ponto de Apoio',
                                ),
                                4 => array (
                                  'cidade' => 'SALVADOR',
                                  'estado' => 'Bahia',
                                  'acronym' => 'BA',
                                  'localidade' => 'Arena Fonte Nova ',
                                ),
                              ),
                              'DF' => array (
                                5 => array (
                                  'cidade' => 'BRASILIA',
                                  'estado' => 'Belo Horizonte',
                                  'acronym' => 'DF',
                                  'localidade' => 'Estádio Mané Garrincha',
                                ),
                                6 => array (
                                  'cidade' => 'BRASILIA',
                                  'estado' => 'Distrito Federal',
                                  'acronym' => 'DF',
                                  'localidade' => 'Estádio Mané Garrincha',
                                ),
                                7 => array (
                                  'cidade' => 'BRASILIA',
                                  'estado' => 'Distrito Federal',
                                  'acronym' => 'DF',
                                  'localidade' => 'Ponto de Apoio',
                                ),
                              ),
                              'MG' => array (
                                8 => array (
                                  'cidade' => 'CONFINS',
                                  'estado' => 'Belo Horizonte',
                                  'acronym' => 'MG',
                                  'localidade' => 'Ponto de Apoio',
                                ),
                                9 => array (
                                  'cidade' => 'BELO HORIZONTE',
                                  'estado' => 'Minas Gerais',
                                  'acronym' => 'MG',
                                  'localidade' => 'Ponto de Apoio',
                                ),
                                10 => array (
                                  'cidade' => 'BELO HORIZONTE',
                                  'estado' => 'Minas Gerais',
                                  'acronym' => 'MG',
                                  'localidade' => 'Mineirão',
                                ),
                              ),
                              'RJ' => array (
                                11 =>  array (
                                  'cidade' => 'RIO DE JANEIRO',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Copacabana - Estadio da Lagoa',
                                ),
                                12 => array (
                                  'cidade' => 'RIO DE JANEIRO',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Copacabana - Arena do Volei',
                                ),
                                13 => array (
                                  'cidade' => 'RIO DE JANEIRO',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Copacabana - marina da Glória',
                                ),
                                14 => array (
                                  'cidade' => 'RIO DE JANEIRO',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Ponto de Apoio',
                                ),
                                15 => array (
                                  'cidade' => 'NOVA IGUACU',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Ponto de Apoio',
                                ),
                                16 => array (
                                  'cidade' => 'RIO DE JANEIRO',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Maracana - Maracanazinho/Maracana',
                                ),
                                17 => array (
                                  'cidade' => 'RIO DE JANEIRO',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Barra - Pontal',
                                ),
                                18 => array (
                                  'cidade' => 'RIO DE JANEIRO',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Barra - Centro de Golfe',
                                ),
                                19 => array (
                                  'cidade' => 'RIO DE JANEIRO',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Barra - Parque olimpico',
                                ),
                                20 => array (
                                  'cidade' => 'RIO DE JANEIRO',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Barra - Rio Centro',
                                ),
                                21 => array (
                                  'cidade' => 'RIO DE JANEIRO',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Barra - Parque olimpico e Copacabana - Forte de Copacabana',
                                ),
                                22 => array (
                                  'cidade' => 'RIO DE JANEIRO',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Maracana - Estádio Olimpico',
                                ),
                                23 => array (
                                  'cidade' => 'RIO DE JANEIRO',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Copacabana - Forte de Copacabana',
                                ),
                                24 => array (
                                  'cidade' => 'NITEROI',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Ponto de Apoio',
                                ),
                                25 => array (
                                  'cidade' => 'RIO DE JANEIRO',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Deodoro - Centro de Tiro / Estadio Olimpico / Centro Hoquei / Centro Aquatico / Arena da Juventude / Hipismo / Parque Radical',
                                ),
                                26 => array (
                                  'cidade' => 'RIO DE JANEIRO',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Maracanã - Maracanazinho / Maracanã',
                                ),
                                27 => array (
                                  'cidade' => 'RIO DE JANEIRO',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Maracana - Sambodromo',
                                ),
                                28 => array (
                                  'cidade' => 'RIO DE JANEIRO',
                                  'estado' => 'Rio de Janeiro',
                                  'acronym' => 'RJ',
                                  'localidade' => 'Barra / Copacabana e Maracanã',
                                ),
                              ),
                              'SP' => array (
                                29 => 
                                array (
                                  'cidade' => 'SAO PAULO',
                                  'estado' => 'São Paulo',
                                  'acronym' => 'SP',
                                  'localidade' => 'Arena Corinthians',
                                ),
                                30 => 
                                array (
                                  'cidade' => 'GUARULHOS',
                                  'estado' => 'São Paulo',
                                  'acronym' => 'SP',
                                  'localidade' => 'Ponto de Apoio',
                                ),
                                31 => 
                                array (
                                  'cidade' => 'SAO PAULO',
                                  'estado' => 'São Paulo',
                                  'acronym' => 'SP',
                                  'localidade' => 'Ponto de Apoio',
                                ),
                             ),
                        );

I tried these methods and none worked:

public function arraySortByColumn(&$arr, $col, $dir = SORT_ASC)
    {
        $sort_col = array();
        foreach ($arr as $key=> $row) {
            $sort_col[$key] = $row[$col];
        }
        array_multisort($sort_col, $dir, $arr);
    }

    public function findMultiIfArray($array, $field, $value)
    {
        while(isset($array[key($array)])){
            if(strpos($array[key($array)][$field], $value) !== false){
                return key($array);
            }
            next($array);
        }
        return -1;
    }

    public function sortKeyLocality($a, $b)
    {
        if ($a['localidade'] == $b['localidade']) {
            return 0;
        }
        return ($a['localidade'] < $b['localidade']) ? -1 : 1;
    }

    function arraySort($array, $on, $order=SORT_ASC){

        $new_array = array();
        $sortable_array = array();

        if (count($array) > 0) {
            foreach ($array as $k => $v) {
                if (is_array($v)) {
                    foreach ($v as $k2 => $v2) {
                        if ($k2 == $on) {
                            $sortable_array[$k] = $v2;
                        }
                    }
                } else {
                    $sortable_array[$k] = $v;
                }
            }

            switch ($order) {
                case SORT_ASC:
                    asort($sortable_array);
                    break;
                case SORT_DESC:
                    arsort($sortable_array);
                    break;
            }

            foreach ($sortable_array as $k => $v) {
                $new_array[$k] = $array[$k];
            }
        }

        return $new_array;
    }

    public function arraySortByColumnRecursive(&$arr, $col, $dir = SORT_ASC) {
        $sort_col = array();
        foreach ($arr as $key=> $row) {
            if (is_array($row)) {
                $sort_col[$key] = $row[$col];
                $this->arraySortByColumnRecursive($row, $col, $dir);
            }
        }
        array_multisort($sort_col, $dir, $arr);
    }
  

To help other people, I'll put here, the method I did to bring the list of this select optgroup :

public function collectionLocais($collection)
    {
        $ufs = array("AC","AL","AM","AP","BA","CE","DF","ES","GO","MA","MT","MS","MG","PA","PB","PR","PE","PI","RJ","RN","RO","RS","RR","SC","SE","SP","TO");
        $ufs = array_values(array_map('current', $ufs));
        foreach ($ufs as $uf) {
            foreach($collection as $k => $local) {
                if ($uf == $local['uf']) {
                    $new_collection[$uf][$local['id']] = array(
                        'localidade' => $local['locality'],
                        'cidade' => $local['city'],
                        'estado' => $local['state'],
                        'acronym' => $uf
                    );

                }

            }
        }
         return $new_collection;
    }
    
asked by anonymous 23.06.2016 / 18:59

2 answers

2

With ksort :

Array tested:

$array = array(
    'AM' => array(
        2 => array(
            'localidade' => '1Arena da Amazonia',
            'cidade' => 'MANAUS',
            'estado' => 'Amazonia',
            'acronym' => 'AM',
        ),
        1 => array(
            'localidade' => '2Arena da Amazonia',
            'cidade' => 'MANAUS',
            'estado' => 'Amazonia',
            'acronym' => 'AM',
        ),
    ),
    'BA' => array(
        5 => array(
            'localidade' => '3Arena da Amazonia',
            'cidade' => 'MANAUS',
            'estado' => 'Amazonia',
            'acronym' => 'AM',
        ),
        3 => array(
            'localidade' => '4Arena da Amazonia',
            'cidade' => 'MANAUS',
            'estado' => 'Amazonia',
            'acronym' => 'AM',
        ),
        '4' => array(
            'localidade' => '5Arena da Amazonia',
            'cidade' => 'MANAUS',
            'estado' => 'Amazonia',
            'acronym' => 'AM',
        ),
    ),
    'DF' => array(
        7 => array(
            'localidade' => '6Arena da Amazonia',
            'cidade' => 'MANAUS',
            'estado' => 'Amazonia',
            'acronym' => 'AM',
        ),
        '8' => array(
            'localidade' => '7Arena da Amazonia',
            'cidade' => 'MANAUS',
            'estado' => 'Amazonia',
            'acronym' => 'AM',
        ),
        6 => array(
            'localidade' => '8Arena da Amazonia',
            'cidade' => 'MANAUS',
            'estado' => 'Amazonia',
            'acronym' => 'AM',
        ),
        9 => array(
            'localidade' => 'zzzz9 da Amazonia',
            'cidade' => 'MANAUS',
            'estado' => 'Amazonia',
            'acronym' => 'AM',
        ),
    ),
);

Sorting:

foreach($array as $key => $arr) {
    ksort($arr);
    $array[$key] = $arr;
}
ksort($array);
echo '<pre>', print_r($array), '</pre>';
    
23.06.2016 / 20:34
0

In the comments the asort () method was mentioned, but it orders by value, in your case , since the ordering is done by key then you should use the ksort () , which has the same goal, but it would sort by keys, it would look like this:

<?php
// array
$data =
    array
    (
        'BA' => array
        (
            4 => array
            (
                'localidade' => 'Arena Fonte Nova',
                'cidade' => 'SALVADOR',
                'estado' => 'Bahia',
                'acronym' => 'BA'
            ),
            3 => array
            (
                'localidade' => 'Ponto de Apoio',
                'cidade' => 'SALVADOR',
                'estado' => 'Bahia',
                'acronym' => 'BA',
            )

        ), 
        'AM' => array
        (
            2 => array
            (
                'localidade' => 'Arena da Amazonia',
                'cidade' => 'MANAUS',
                'estado' => 'Amazonia',
                'acronym' => 'AM'
            ),
            1 => array
            (
                'localidade' => 'Ponto de Apoio',
                'cidade' => 'MANAUS',
                'estado' => 'Amazonia',
                'acronym' => 'AM'
            )
        )
    );

   // resultado será o array normal
    var_dump($data);

    ksort($data);

    foreach($data as $key => $value)
    {
        ksort($data[$key]);
    }

    var_dump($data);

The output of the ordered array will be:

array (size=2)
  'AM' => 
    array (size=2)
      1 => 
        array (size=4)
          'localidade' => string 'Ponto de Apoio' (length=14)
          'cidade' => string 'MANAUS' (length=6)
          'estado' => string 'Amazonia' (length=8)
          'acronym' => string 'AM' (length=2)
      2 => 
        array (size=4)
          'localidade' => string 'Arena da Amazonia' (length=17)
          'cidade' => string 'MANAUS' (length=6)
          'estado' => string 'Amazonia' (length=8)
          'acronym' => string 'AM' (length=2)
  'BA' => 
    array (size=2)
      3 => 
        array (size=4)
          'localidade' => string 'Ponto de Apoio' (length=14)
          'cidade' => string 'SALVADOR' (length=8)
          'estado' => string 'Bahia' (length=5)
          'acronym' => string 'BA' (length=2)
      4 => 
        array (size=4)
          'localidade' => string 'Arena Fonte Nova' (length=16)
          'cidade' => string 'SALVADOR' (length=8)
          'estado' => string 'Bahia' (length=5)
          'acronym' => string 'BA' (length=2)

See: Sorting array in the PHP documentation to see a table with all sorting methods and its function.

    
23.06.2016 / 19:56