Ordering of all elements of a multidimensional array (array)

Asked

Viewed 241 times

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 be more or less 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’m going to put here, the method I did to bring up 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;
    }
  • Opa, see http://answall.com/questions/3546/order-um-array-multidimensional-values-one%C3%A9ricos? Rq=1

  • i have seen, but there is no solution in this answer/question, the function asort() did not order the indexes.

  • I’ll post the answer.

  • The way that worked for me, was to order by the bank and bring as wanted. But I could not do it even through an array sort.

2 answers

2


With ksort:

Tested array:

$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',
        ),
    ),
);

Ordination:

foreach($array as $key => $arr) {
    ksort($arr);
    $array[$key] = $arr;
}
ksort($array);
echo '<pre>', print_r($array), '</pre>';
  • Not ordered anything. (, and still reset the keys... they are Ids, can not be changed.

  • Edited on top. Is that it? I’m sorry, is that by its final result it looked like it was that

  • Now I see it worked, thank you, I did the execution of the result here.

  • Sorry, I didn’t realize at first that the numeric keys were to keep. Obgado @Ivanferrer

  • I had ordered the exit at the bank to solve my problem, but your answer also solves my case. Thank you.

0

In the comments the method was cited asort(), but it sorts by value, in your case, how the sort is done by key so it should use the ksort(), which has the same goal, but orders by keys, would be 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);

To exit 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)

Behold: Ordering array in the PHP documentation to see a table with all sorting methods and their function.

  • array_reverse(), would solve the reversal of the order, however, using ksort() nor "lucky" funf.

  • You must be doing something wrong, run the example that you see works, must be hidden from the data in the question so can not help. Or maybe we don’t understand what you’re trying to do.

  • I tried too and it doesn’t happen: $data = array_map('ksort', $data);

  • But I solved the problem in the bank itself, thanks!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.