0

我在 PHP 中有一个带有数组的数组,我想根据每个元素中的字段对数组的顶层进行排序,并且我还想根据该元素的数组的元素对每个元素中的数组进行排序. (见示例)。我希望它最终$data首先具有'primary'值为“第一”的项目,然后是“第二”。我也希望它在“第一”和“第二”内,该字段下的数组'secondary'首先具有'val'“foo”然后是“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。

4

1 回答 1

0

试试这个

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

为什么会这样?

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

当您添加&- 而foreach不是复制变量时,并通过引用使用它

于 2011-07-04T14:26:37.300 回答