使用usort使用数组PHP对数组进行排序

时间:2011-07-04 14:18:41

标签: php sorting php-5.2

我在PHP中有一个带数组的数组数组,我想根据每个元素中的一个字段对数组的顶层进行排序,我还想根据数组的元素对每个元素中的数组进行排序那个元素。 (见例)。我想要它,以便最后,$data首先具有'primary'值为'first'然后'second'的项目。我也想要它,以便在'first'和'second'之内,字段'secondary'下的数组首先包含'val''foo'然后'bar'的项目(对于'first'而言和'第二')

$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。

1 个答案:

答案 0 :(得分: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时,不会复制变量,并通过引用使用它