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

suz*_*suz 6 php arrays foreach multidimensional-array unset

我得到了多维数组.从每个子数组,我想删除/取消设置索引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'
        )               
)
Run Code Online (Sandbox Code Playgroud)

我想从子数组中删除索引为'1'的每个元素.期望的输出是:

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

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

    [2421] => Array
        (
            [0] => 5
            [context] => 'zzz'
        )               
)
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?

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

   }
}
Run Code Online (Sandbox Code Playgroud)

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

Pou*_*abi 11

简单的方法!?你可以用一个foreach做到这一点!

foreach ($data as $key => $subArr) {
    unset($subArr['1']);
    $data[$key] = $subArr;  
}
Run Code Online (Sandbox Code Playgroud)


Aru*_*mar 8

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

foreach ($data as $key => $subArr) { 
    unset($data[$key][1]);      
}
Run Code Online (Sandbox Code Playgroud)


axi*_*iac 5

它不起作用,因为$subArr从外部foreach包含值的副本$data和内部foreach修改这些副本,留下$data未触及.

您可以修复通过讲述PHP作出$subArr引用存储在原始值$data:

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

另一种选择是使用功能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);
Run Code Online (Sandbox Code Playgroud)