简体   繁体   中英

Multi-Dimentional Array Sort using PHP

I have an unsorted array like this:

Array
(
    [10] => Array
        (
            [67] => Array
                (
                    [43] => Array
                        (
                            [23] => Array
                                (
                                    [5] => 123
                                    [12] => 321
                                    [8] => 543
                                    [15] => 351
                                    [1] => 323
                                    [13] => 209
                                )

                            [65] => 123
                            [45] => 321
                            [87] => 543
                            [56] => 351
                            [1] => 323
                            [13] => 209
                        )

                    [54] => 123
                    [41] => 321
                    [4] => 543
                    [55] => 351
                    [1] => 323
                    [13] => 209
                )

            [15] => 123
            [26] => 321
            [37] => 543
            [48] => 351
            [68] => 323
            [13] => 209
        )

    [5] => Array
        (
            [43] => Array
                (
                    [23] => Array
                        (
                            [5] => 123
                            [12] => 321
                            [8] => 543
                            [15] => 351
                            [1] => 323
                            [13] => 209
                        )

                    [65] => 123
                    [45] => 321
                    [87] => 543
                    [56] => 351
                    [1] => 323
                    [13] => 209
                )

            [54] => 123
            [41] => 321
            [4] => 543
            [55] => 351
            [1] => 323
            [13] => 209
        )

    [15] => Array
        (
            [23] => Array
                (
                    [5] => 123
                    [12] => 321
                    [8] => 543
                    [15] => 351
                    [1] => 323
                    [13] => 209
                )

            [65] => 123
            [45] => 321
            [87] => 543
            [56] => 351
            [1] => 323
            [13] => 209
        )

    [25] => Array
        (
            [5] => 123
            [12] => 321
            [8] => 543
            [15] => 351
            [1] => 323
            [13] => 209
        )

)

I want it to be sorted like this

Array
(
    [5] => Array
        (
            [1] => 323
            [4] => 543
            [13] => 209
            [41] => 321
            [43] => Array
                (
                    [1] => 323
                    [13] => 209
                    [23] => Array
                        (
                            [1] => 323
                            [5] => 123
                            [8] => 543
                            [12] => 321
                            [13] => 209
                            [15] => 351
                        )
                    [45] => 321
                    [56] => 351
                    [65] => 123
                    [87] => 543
                )
            [54] => 123
            [55] => 351    

        )

    [10] => Array
        (

            [13] => 209
            [15] => 123
            [26] => 321
            [37] => 543
            [48] => 351
            [67] => Array
                (
                    [1] => 323
                    [4] => 543
                    [13] => 209
                    [41] => 321
                    [43] => Array
                        (
                            [1] => 323
                            [13] => 209
                            [23] => Array
                                (
                                    [1] => 323
                                    [5] => 123
                                    [8] => 543
                                    [12] => 321
                                    [13] => 209
                                    [15] => 351
                                )
                            [45] => 321
                            [56] => 351
                            [65] => 123
                            [87] => 543                                
                        )
                    [54] => 123
                    [55] => 351
                )            
            [68] => 323

        )

    [15] => Array
        (
            [1] => 323
            [13] => 209
            [23] => Array
                (
                    [1] => 323
                    [5] => 123
                    [8] => 543
                    [12] => 321
                    [13] => 209
                    [15] => 351
                )
            [45] => 321
            [56] => 351
            [65] => 123
            [87] => 543    
        )

    [25] => Array
        (  
            [1] => 323
            [5] => 123
            [8] => 543
            [12] => 321
            [13] => 209
            [15] => 351
        )

)

i tried the uksort but it only sorts the first array..

uksort($m_array,'sort_function');

function sort_function($a,$b){

    if($a>$b){
        return true;
    }else if($a<$b){
        return false;
    }else{
        return 0;
    }

}

Finally Found The Solution:

This is The Unsorted Array

Array
(
    [10] => Array
        (
            [67] => Array
                (
                    [43] => Array
                        (
                            [23] => Array
                                (
                                    [5] => 123
                                    [12] => 321
                                    [8] => 543
                                    [15] => 351
                                    [1] => 323
                                    [13] => 209
                                )

                            [65] => 123
                            [45] => 321
                            [87] => 543
                            [56] => 351
                            [1] => 323
                            [13] => 209
                        )

                    [54] => 123
                    [41] => 321
                    [4] => 543
                    [55] => 351
                    [1] => 323
                    [13] => 209
                )

            [15] => 123
            [26] => 321
            [37] => 543
            [48] => 351
            [68] => 323
            [13] => 209
        )

    [5] => Array
        (
            [43] => Array
                (
                    [23] => Array
                        (
                            [5] => 123
                            [12] => 321
                            [8] => 543
                            [15] => 351
                            [1] => 323
                            [13] => 209
                        )

                    [65] => 123
                    [45] => 321
                    [87] => 543
                    [56] => 351
                    [1] => 323
                    [13] => 209
                )

            [54] => 123
            [41] => 321
            [4] => 543
            [55] => 351
            [1] => 323
            [13] => 209
        )

    [15] => Array
        (
            [23] => Array
                (
                    [5] => 123
                    [12] => 321
                    [8] => 543
                    [15] => 351
                    [1] => 323
                    [13] => 209
                )

            [65] => 123
            [45] => 321
            [87] => 543
            [56] => 351
            [1] => 323
            [13] => 209
        )

    [25] => Array
        (
            [5] => 123
            [12] => 321
            [8] => 543
            [15] => 351
            [1] => 323
            [13] => 209
        )

)

Here Is My Code:

function recursive_sort(&$m_array) {
fs($m_array);
if(is_array($m_array)){    
    foreach($m_array as $k=> &$v){
        if (isset($v)) {
             recursive_sort($v);
         }
    }
}
}


function sortByOrder($a, $b) {
if($a>$b){
    return true;
}else if($a<$b){
    return false;
}else{
    return 0;
}
}

function fs(&$m_array){
if(is_array($m_array)){
    uksort($m_array, 'sortByOrder');
}
}

recursive_sort($m_array);

print_r($m_array);

And Here Is The Output:

Array
(
    [5] => Array
        (
            [1] => 323
            [4] => 543
            [13] => 209
            [41] => 321
            [43] => Array
                (
                    [1] => 323
                    [13] => 209
                    [23] => Array
                        (
                            [1] => 323
                            [5] => 123
                            [8] => 543
                            [12] => 321
                            [13] => 209
                            [15] => 351
                        )

                    [45] => 321
                    [56] => 351
                    [65] => 123
                    [87] => 543
                )

            [54] => 123
            [55] => 351
        )

    [10] => Array
        (
            [13] => 209
            [15] => 123
            [26] => 321
            [37] => 543
            [48] => 351
            [67] => Array
                (
                    [1] => 323
                    [4] => 543
                    [13] => 209
                    [41] => 321
                    [43] => Array
                        (
                            [1] => 323
                            [13] => 209
                            [23] => Array
                                (
                                    [1] => 323
                                    [5] => 123
                                    [8] => 543
                                    [12] => 321
                                    [13] => 209
                                    [15] => 351
                                )

                            [45] => 321
                            [56] => 351
                            [65] => 123
                            [87] => 543
                        )

                    [54] => 123
                    [55] => 351
                )

            [68] => 323
        )

    [15] => Array
        (
            [1] => 323
            [13] => 209
            [23] => Array
                (
                    [1] => 323
                    [5] => 123
                    [8] => 543
                    [12] => 321
                    [13] => 209
                    [15] => 351
                )

            [45] => 321
            [56] => 351
            [65] => 123
            [87] => 543
        )

    [25] => Array
        (
            [1] => 323
            [5] => 123
            [8] => 543
            [12] => 321
            [13] => 209
            [15] => 351
        )

)

This is a recursive ksort solution:

$m_array = [
    2 => [
        22 => [
            229 => 'i',
            221 => 'h'
        ],
        21 => 'g'
    ],
    1 => [
        12 => [
            122 => 'f',
            121 => [
                1212 => 'e',
                1211 => 'd'
            ]
        ],
        11 => [
            111 => [
                1112 => 'b',
                1119 => 'c',
                1111 => 'a'
            ]
        ],
    ],
];

function ksort_recursive(&$array) {
    if (is_array($array)) {
        array_walk($array, "ksort_recursive");
        ksort($array);
    }
}

ksort_recursive($m_array);
print_r($m_array);

Output:

Array
(
    [1] => Array
        (
            [11] => Array
                (
                    [111] => Array
                        (
                            [1111] => a
                            [1112] => b
                            [1119] => c
                        )

                )

            [12] => Array
                (
                    [121] => Array
                        (
                            [1211] => d
                            [1212] => e
                        )

                    [122] => f
                )

        )

    [2] => Array
        (
            [21] => g
            [22] => Array
                (
                    [221] => h
                    [229] => i
                )

        )

)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM