【问题标题】:Using usort to sort Arrays of Arrays with Arrays PHP用 Arrays PHP 使用 usort 对 Arrays of Arrays 进行排序
【发布时间】:2011-07-04 14:18:41
【问题描述】:

我在 PHP 中有一个带有数组的数组,我想根据每个元素中的字段对数组的顶层进行排序,我还想根据数组的元素对每个元素中的数组进行排序那个元素。 (见示例)。我希望它最终,$data 首先拥有 'primary' 值为“第一”然后是“第二”的项目。我也希望它在“第一”和“第二”中,字段'secondary'下的数组首先具有“foo”的'val'的项目,然后是“bar”(对于“第一”和“第二” )

$data = array (
    array (
        'myid'      => 4,
        'primary'   => 'second',
        'secondary' => array (
            array (
                'myid' => 10,
                'val'  => 'bar',
            ),
            array (
                'myid' => 8,
                'val'  => 'foo',
            ),
        ),
    ),
    array (
        'myid'      => 2,
        'primary'   => 'first',
        'secondary' => array (
            array (
                'myid' => 10,
                'val'  => 'bar',
            ),
            array (
                'myid' => 8,
                'val'  => 'foo',
            ),
        ),
    ),
);

function mysort($a, $b) {
    return $a['myid'] > $b['myid'];
}

echo "pre sort:\n";
print_r($data);

usort($data, 'mysort');

echo "post top level sort:\n";
print_r($data);

foreach ($data as $k=>$item) {
    usort($item['secondary'], 'mysort');
    echo "Second Level Item sort:\n";
    print_r($item['secondary']);
}

echo "post second level sort:\n";
print_r($data);

为什么我会得到以下最终输出?

post second level sort:
Array
(
    [0] => Array
        (
            [myid] => 2
            [primary] => first
            [secondary] => Array
                (
                    [0] => Array
                        (
                            [myid] => 10
                            [val] => bar
                        )

                    [1] => Array
                        (
                            [myid] => 8
                            [val] => foo
                        )

                )

        )

    [1] => Array
        (
            [myid] => 4
            [primary] => second
            [secondary] => Array
                (
                    [0] => Array
                        (
                            [myid] => 10
                            [val] => bar
                        )

                    [1] => Array
                        (
                            [myid] => 8
                            [val] => foo
                        )

                )

        )

)

顺便说一下,我使用的是 PHP 5.2.17。

【问题讨论】:

    标签: php sorting php-5.2


    【解决方案1】:

    试试这个

    foreach ($data as $k=>&$item) {
        usort($item['secondary'], 'mysort');
        echo "Second Level Item sort:\n";
        print_r($item['secondary']);
    }
    

    为什么会这样?

    因为默认情况下foreach 会复制其中的所有变量。
    因此,如果您更改foreach 中的变量,则仅更改局部变量,并且在foreach 结束后,该变量将与foreach 之前相同

    当你添加& - 比foreach 不复制变量,并通过引用使用它

    【讨论】:

    • 谢谢!我想这就是发生的事情,但不知道使用&
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    相关资源
    最近更新 更多