【问题标题】:Delete element from triply nested array PHP从三重嵌套数组PHP中删除元素
【发布时间】:2021-01-20 02:35:58
【问题描述】:

我正在努力弄清楚如何根据最深级别的值从三重嵌套数组中删除元素。我想删除 time == "NA" 的任何位置子数组。我的数组结构如下。

Array
(
    [0] => Array
        (
            [Id] => 151601
            [First_Name] => JOHN
            [Last_Name] => DOE
            [Location_Id] => 10
            [Positions] => Array
                (
                    [North] => Array
                        (
                            [Current_Level] => 4
                            [Last_Date] => 11/7/2001
                            [Time] => 4:15 AM
                        )

                    [East] => Array
                        (
                            [Current_Level] => 4
                            [Last_Date] => 7/10/2003
                            [Time] => 7:30 PM
                        )

                    [South] => Array
                        (
                            [Current_Level] => 2
                            [Last_Date] => 8/10/2007
                            [Time] => NA
                        )

                    [West] => Array
                        (
                            [Current_Level] => NA
                            [Last_Date] => NA
                            [Time] => NA
                        )

                )

        )

所以我的最终结果是

Array
    (
        [0] => Array
            (
                [Id] => 151601
                [First_Name] => JOHN
                [Last_Name] => DOE
                [Location_Id] => 10
                [Positions] => Array
                    (
                        [North] => Array
                            (
                                [Current_Level] => 4
                                [Last_Date] => 11/7/2001
                                [Time] => 4:15 AM
                            )
    
                        [East] => Array
                            (
                                [Current_Level] => 4
                                [Last_Date] => 7/10/2003
                                [Time] => 7:30 PM
                            )
    
                    )
    
            )

这是我目前正在尝试的,但它引发了非法偏移类型错误。我想我只是没有取消正确的事情。我可以让它回显所有正确的子数组,但是当我尝试取消设置时,我得到一个偏移错误。

foreach($records as $record) {
    foreach ($record as $value) {
      if (is_array($value)) {
        foreach ($value as $position) {
          if($position["Time"] == "NA") {
            unset($records[$record][$value]);
          }
        }
      }
    }
  }

【问题讨论】:

    标签: php arrays for-loop multidimensional-array


    【解决方案1】:

    通过通过引用传递数组元素和过滤功能,您可以将代码简化为:

    foreach($records as &$record) {
        $record['Positions'] = array_filter(
            $record['Positions'], 
            function ($v) {
                return $v['Time'] !== 'NA';
            }
        );
    }
    

    小提琴here.

    【讨论】:

    • 这是按原样返回嵌套数组。没有任何内容被过滤
    • 注意&$record& 符号。还添加了一个小提琴。
    【解决方案2】:

    Php 在 foreach 中使用数组的副本。您还可以在 foreach 中使用一个键,并使用它来取消设置原始 $records 数组中的值。

    foreach ($records as $keyRecord => $record) {
        foreach ($record as $key => $value) {
            if (is_array($value)) {
                foreach ($value as $keyPosition => $position) {
                    if ($position["Time"] == "NA") {
                        unset($records[$keyRecord][$key][$keyPosition]);
                    }
                }
            }
        }
    }
    
    print_r($records);
    

    输出

    Array
    (
        [0] => Array
            (
                [Id] => 151601
                [First_name] => John
                [Positions] => Array
                    (
                        [North] => Array
                            (
                                [Current_Level] => 4
                                [Last_Date] => 11/7/2001
                                [Time] => 4:15 AM
                            )
    
                        [East] => Array
                            (
                                [Current_Level] => 4
                                [Last_Date] => 7/10/2003
                                [Time] => 7:30 PM
                            )
    
                    )
    
            )
    
    )
    

    Php demo

    【讨论】:

      猜你喜欢
      • 2019-09-13
      • 2022-07-19
      • 2021-12-11
      • 2019-01-25
      • 1970-01-01
      • 2013-11-22
      • 2018-08-29
      • 1970-01-01
      相关资源
      最近更新 更多