如何通过键对多维数组进行排序

时间:2012-11-27 13:19:09

标签: php

Array
(
    [12] => Array
        (
            [id] => 12
            [name] => Car
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 14
                            [name] => Volvo
                        )

                    [1] => Array
                        (
                            [id] => 15
                            [name] => Mercedes-Benz
                        )

                )

        )

    [13] => Array
        (
            [id] => 13
            [name] => Manga
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 16
                            [name] => Naruto
                        )

                    [1] => Array
                        (
                            [id] => 17
                            [name] => Hunter X Hunter
                        )

                )

        )

    [18] => Array
        (
            [id] => 18
            [name] => aa
            [children] => Array
                (
                )

        )



)

伙计我想对这个数组的值进行排序,我想按键对它进行排序,键是'name'。这应该通过键'name'对第一级和第二级进行排序。

这个数组我放入print_r()所以它看起来像这样。该阵列没有修复,所以我可以在将来添加。

所以在排序数组的最终值后......

Array
(

    [18] => Array
        (
            [id] => 18
            [name] => aa
            [children] => Array
                (
                )

        )

    [12] => Array
        (
            [id] => 12
            [name] => Car
            [children] => Array
                (
            [0] => Array
                        (
                            [id] => 15
                            [name] => Mercedes-Benz
                        )

                    [1] => Array
                        (
                            [id] => 14
                            [name] => Volvo
                        )

            )

        )

    [13] => Array
        (
            [id] => 13
            [name] => Manga
            [children] => Array
                (
            [0] => Array
                        (
                            [id] => 17
                            [name] => Hunter X Hunter
                        )

                    [1] => Array
                        (
                            [id] => 16
                            [name] => Naruto
                        )

                )

        )
)



这是代码中的数组。

$categories = array(
                12 => 
                    array('id' =>12, 
                              'name' => 'Car',
                                       'children' => 
                                        array(
                                            array('id' => 14,
                                                      'name' => 'volvo'
                                            )
                                        ),
                                        array(
                                            array('id' => 15,
                                                      'name' => 'Mercedez-Benz'
                                            )
                                        )
                            ),

                13 => 
                    array('id' =>13, 
                              'name' => 'Manga',
                                       'children' => 
                                        array(
                                            array('id' => 16,
                                                      'name' => 'Naruto'
                                            )
                                        ),
                                        array(
                                            array('id' => 17,
                                                      'name' => 'Hunter X Hunter'
                                            )
                                        )
                            ),

                18=>
                    array('id' => 18, 
                              'name'=> 'aa', 
                                      'children' => array())


                );

echo "<pre>";

print_r($categories);

3 个答案:

答案 0 :(得分:0)

'name'不是真正的'Key',只是说,因为Php中的'key'通常表示数组的名称,如数组中的'18'和'12'等等,如下所示:

<?php
    $fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
    ksort($fruits);
    foreach ($fruits as $key => $val) {
        echo "$key = $val\n";
    }
?>

在这个例子中,结果将是:

a = orange
b = banana
c = apple
d = lemon

无论如何要回答关于如何在“名称”上对其进行排序的问题,请使用“usort”:

function cmp($a, $b) {
   return $a['name'] - $b['name'];
}

usort($arr,"cmp");

请查看以下链接以获取更多信息: How do I sort a PHP array by an element nested inside?

答案 1 :(得分:0)

如果使用php 5.3+,您可以在代码中使用闭包并按此类排序

usort($categories,function($a,$b){
    return $a['name'] - $b['name']
}

答案 2 :(得分:0)

所以,

我会尝试向你解释一下

您的数组很大,是的,但您只想对键值'[name]'进行排序。 在我的测试中,我使用了您提供的阵列:

$categories = array(
            12 => 
                array('id' =>12, 
                          'name' => 'Car',
                                   'children' => 
                                    array(
                                        array('id' => 14,
                                                  'name' => 'volvo'
                                        )
                                    ),
                                    array(
                                        array('id' => 15,
                                                  'name' => 'Mercedez-Benz'
                                        )
                                    )
                        ),

            13 => 
                array('id' =>13, 
                          'name' => 'Manga',
                                   'children' => 
                                    array(
                                        array('id' => 16,
                                                  'name' => 'Naruto'
                                        )
                                    ),
                                    array(
                                        array('id' => 17,
                                                  'name' => 'Hunter X Hunter'
                                        )
                                    )
                        ),

            18=>
                array('id' => 18, 
                          'name'=> 'aa', 
                                  'children' => array())


            );

如果声明了数组,你可以像这样添加usort:

usort($categories,"sortByName");

上面的第一个元素($ categories)是你的数组,第二个元素将提供一个函数的名称,在本例中是'sortByName'。

之后,你只需在你的代码中添加一个函数(无论你把它放在哪里都没关系,即使它在页面的底部):

function sortByName($categories, $b) {
    return strcasecmp($categories["name"], $b["name"]);
}

基本上这个函数的功能是将你的数组与...你的数组进行比较:)所以它可以按照你想要的名称对其进行alfaabetically排序。 'strcasecmp'是将你的字符串与彼此进行比较以对其进行排序。并非这种情况不敏感(strcmp也会区分大小写)。我假设你不希望它检查大写等等,否则结果将不是你想要的。

添加该代码后,您可以再次打印数组:

echo "<pre>";
print_r($categories);

你的结果将是:

Array
(
[0] => Array
    (
        [id] => 18
        [name] => aa
        [children] => Array
            (
            )

    )

[1] => Array
    (
        [id] => 12
        [name] => Car
        [children] => Array
            (
                [0] => Array
                    (
                        [id] => 14
                        [name] => volvo
                    )

            )

        [0] => Array
            (
                [0] => Array
                    (
                        [id] => 15
                        [name] => Mercedez-Benz
                    )

            )

    )

[2] => Array
    (
        [id] => 13
        [name] => Manga
        [children] => Array
            (
                [0] => Array
                    (
                        [id] => 16
                        [name] => Naruto
                    )

            )

        [0] => Array
            (
                [0] => Array
                    (
                        [id] => 17
                        [name] => Hunter X Hunter
                    )

            )

    )

我希望这就是你想要的。 : - )