【问题标题】:PHP: remove element from multidimensional array (by key) using foreachPHP:使用 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 之前使用 &。在这种情况下,该值将通过引用分配。

标签: php arrays multidimensional-array foreach unset


【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 2017-10-19
        • 2017-04-11
        • 2012-12-27
        • 2012-04-27
        • 1970-01-01
        • 2014-10-30
        • 1970-01-01
        • 2017-06-23
        相关资源
        最近更新 更多