在已洗牌的数组上使用unset()的意外行为

时间:2013-07-18 16:09:46

标签: php

这是测试代码,用于获取数组数组,对它们进行混洗,并将值分配给父数组中的['data']元素,然后删除一个元素。只是为了说明一点,这是非常基本的:

$g = //some array;

shuffle($g);
foreach ($g as &$r) {
    shuffle($r);
}
$tables[] = array('name' => 'table1', 'data' => $g);

shuffle($g);
foreach ($g as &$r) {
    shuffle($r);
}
$tables[] = array('name' => 'table2', 'data' => $g);

shuffle($g);
foreach ($g as &$r) {
    shuffle($r);
}
$tables[] = array('name' => 'table3', 'data' => $g);

unset($tables[0]['data'][0][0]);

print_r($tables);

当$ g是一个包含多个元素的数组,并且嵌套数组有多个元素时,它可以正常工作。删除数据元素中第一个嵌套数组中的第一个值:

$g = array('12' => array('11111', '22222'), '56' => array('55555', '66666'));

// Output
Array
    [0] => Array
        [name] => table1
        [data] => Array
            [0] => Array
                [1] => 66666
            [1] => Array
                [0] => 11111
                [1] => 22222
    [1] => Array
        [name] => table2
        [data] => Array
            [0] => Array
                [0] => 11111
                [1] => 22222
            [1] => Array
                [0] => 55555
                [1] => 66666
     [2] => Array
         [name] => table3
         [data] => Array
            [0] => Array
                [0] => 55555
                [1] => 66666
            [1] => Array
                [0] => 11111
                [1] => 22222

当$ g是包含一个元素的数组时,将删除所有数据元素中的第一个元素,这是不期望的:

$g = array('12' => array('11111', '22222'));

// Output
Array
    [0] => Array
        [name] => table1
        [data] => Array
            [0] => Array
                [1] => 22222
    [1] => Array
        [name] => table2
        [data] => Array
            [0] => Array
                [1] => 22222
    [2] => Array
        [name] => table3
        [data] => Array
            [0] => Array
                [1] => 22222

$g = array('12' => array('11111'));

// Output
Array
    [0] => Array
        [name] => table1
        [data] => Array
            [0] => Array
                    (Empty)
    [1] => Array
        [name] => table2
        [data] => Array
            [0] => Array
                    (Empty)
    [2] => Array
        [name] => table3
        [data] => Array
            [0] => Array
                    (Empty)

我看不出这是怎样预期的行为。这是漫长的一天。那么有人能让我摆脱痛苦并告诉我在这里缺少什么吗?

感谢。

随后: 刚看到这可能是我的答案:

PHP shuffle not working like expected on my nested array

稍后:

是的,确实如此。在foreach()循环之后添加了未设置($ r)并且它工作正常。无需回复!

1 个答案:

答案 0 :(得分:1)

刚看到这个提供了答案:

PHP shuffle not working like expected on my nested array

所以在foreach()循环之后添加了未设置($ r),它运行正常。