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

Posted

技术标签:

【中文标题】PHP:使用 foreach 从多维数组中删除元素(按键)【英文标题】:PHP: remove element from multidimensional array (by key) using foreach 【发布时间】:2015-02-13 11:29:08 【问题描述】:

我得到了多维数组。从每个子数组中,我想删除/取消设置索引为 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]);
       

   

如果这个问题对你们来说是微不足道的,我很抱歉。

【问题讨论】:

这是因为 foreach 复制了元素并且不适用于原始数组,您可以通过引用分配来避免这种情况。为了能够直接修改循环中的数组元素,在 $subArr 之前使用 &。在这种情况下,该值将通过引用分配。 【参考方案1】:

试试这个:

<?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

【讨论】:

【参考方案2】:

您正在更改子数组而不是主数组尝试这可能会有所帮助

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

【讨论】:

为我工作!!谢谢。【参考方案3】:

简单的方法!? 只需一个 foreach 就可以做到这一点!

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

【讨论】:

【参考方案4】:

它不起作用,因为外部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);

【讨论】:

以上是关于PHP:使用 foreach 从多维数组中删除元素(按键)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用php在foreach循环中获取多维数组的键? [复制]

php 多维数组元素值替换【高手进来】

Php多维数组与混合for和Foreach循环

如何在 Laravel/PHP 中创建多维数组

PHP如何将嵌套的foreach变成数组的数组(多维数组)

PHP foreach 删除数组元素