PHP:使用foreach按键从多维数组中删除元素。

8

我有一个多维数组。我想从每个子数组中删除/取消索引为1的值。我的数组是$data。

Array
(
    [3463] => Array
        (
            [0] => 1
            [1] => 2014
            [context] => 'aaa'
        )

    [3563] => Array
        (
            [0] => 12
            [1] => 2014
            [context] => 'aaa'
        )       

    [2421] => Array
        (
            [0] => 5
            [1] => 2014
            [context] => 'zzz'
        )               
)

我希望从子数组中删除每个索引为“1”的元素。期望输出结果是:
Array
(
    [3463] => Array
        (
            [0] => 1
            [context] => 'aaa'
        )

    [3563] => Array
        (
            [0] => 12
            [context] => 'aaa'
        )       

    [2421] => Array
        (
            [0] => 5
            [context] => 'zzz'
        )               
)

为什么这不起作用?
foreach ($data as $subArr) {
   foreach ($subArr as $key => $value) {
       if ($key == '1') {
        unset($subArr[$key]);
       }

   }
}

如果这个问题对你们来说很琐碎,我很抱歉。


3
由于foreach循环会复制元素并且不在原始数组上工作,因此您可以通过引用赋值来避免这种情况。为了能够直接在循环中修改数组元素,请在$subArr之前加上&符号。在这种情况下,该值将被引用赋值。 - Benjamin
4个回答

17

一种简单的方法!? 只需要使用一个foreach就可以完成!

foreach ($data as $key => $subArr) {
    unset($subArr['1']);
    $data[$key] = $subArr;  
}

foreach ($data as $key => &$subArr) unset($subArr['1']); - undefined

11

你正在对子数组进行更改,而不是主数组。尝试这个方法可能会有帮助。

foreach ($data as $key => $subArr) { 
    unset($data[$key][1]);      
}

10

它不起作用是因为外部foreach中的$subArr包含$data值的副本,而内部foreach修改这些副本,使得$data没有被改变。

您可以通过告诉PHP$subArr引用到存储在$data中的原始值来解决这个问题:

foreach ($data as &$subArr) {
   foreach ($subArr as $key => $value) {
       if ($key == '1') {
        unset($subArr[$key]);
       }
   }
}

另一个选择是使用函数array_map()。它使用回调函数,可以检查(并修改)$data的每个值,并返回一个新数组。

$clean = array_map(
    function (array $elem) {
        unset($elem['1']);        // modify $elem
        return $elem;             // and return it to be put into the result
    },
    $data
);

print_r($clean);

4

尝试这个:

<?php 
    $data = Array
    (
        '3463' => Array
            (
                '0' => 1,
                '1' => 2014,
                'context' => 'aaa'
            ),

        '3563' => Array
            (
                '0' => 12,
                '1' => 2014,
                'context' => 'aaa'
            ),       

        '2421' => Array
            (
                '0' => 5,
                '1' => 2014,
                'context' => 'zzz'
            )               
    );

    foreach ($data as $k=>$subArr) {
        foreach ($subArr as $key => $value) {

            if ($key == '1') {
                unset($data[$k][$key]);
            }

        }
    }
print_r($data);// display the output

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接