【问题标题】:PHP How to Unset Member of Multidimensional Array?PHP如何取消设置多维数组的成员?
【发布时间】:2013-07-26 14:02:49
【问题描述】:

我有一个像这样的三维数组

Array(
[Group 1] => Array
    (
        [0] => Array
            (
                [category] => Group1
                [firstname] => John
                [lastname] => Johns
                [image] => /mysite.etc/jj.jpg
            )
        [1] => Array
            (
                [category] => Group1
                [firstname] => John
                [lastname] => James
                [image] => /mysite.etc/jj2.jpg
            )
    )
[Group 2] => Array
    (
        [0] => Array
            (
                [category] => Group2
                [firstname] => John
                [lastname] => Jackson
                [image] => NULL
            )
        [1] => Array
            (
                [category] => Group2
                [firstname] => John
                [lastname] => Jimson
                [image] => /mysite.etc/jj4.jpg   
            )
    )...etc)

我正在尝试遍历数组并删除任何在[image] 单元格中没有值的people(即数组的第二级)。

我试过了

foreach($MyArray as $Key=>&$group){ 
    foreach($group as &$staff){ 
        if(!file_exists($staff['image'])){
            unset($staff);
        }
    } 
}

但这不会删除没有图像的数组项。该循环正确识别没有图像的员工,就好像我包含一些代码将它们回显到页面上一样,这是可行的。只是没有从 $MyArray 数组中取消它们。

谁能帮我实现这个目标?

【问题讨论】:

    标签: php arrays


    【解决方案1】:
    foreach($MyArray as $Key=>$group){
         foreach($group as $k=>$staff){ 
             if( !file_exists($staff['image'])) {
                 unset($MyArray[$Key][$k]);
              }
         }
    }
    

    //你应该知道$group和$staff是临时变量

    【讨论】:

      【解决方案2】:
      foreach ($MyArray as $Key=>$group) {
      
          foreach ($group as $k=>$staff) {
      
               if( empty($staff['image']) || !file_exists($staff['image'])) {
                    unset($MyArray[$key][$k]);
               }
      
          }
      
      }
      

      【讨论】:

      • $staff 是一个临时变量。此代码不会影响 OP 尝试执行的原始数组。看看下面 Jason Yang 的回答。
      • Maximus2012 - 没有将变量定义为 &$staff(带有 & 符号)使其成为对原始对象的引用,而不是临时副本?
      • 我认为确实如此,但我对此并不完全确定。正如 Jason 和 Aris 的回答所表明的那样,您实际上不需要这样做。但是,您在使用 &$staff 时是否收到任何错误消息?
      • 我不喜欢在这种情况下使用 & 符号。没必要。
      【解决方案3】:

      条件应该是这样的。

      foreach($MyArray as $Key=>&$group){            
          foreach($group as $staffkey=>$staff){
            if( $staff['image'] == null)) 
            {
              unset($MyArray[$key][$staffkey]);
            } 
          }
      }
      

      【讨论】:

        【解决方案4】:

        您可以为此使用 array_filter:

        带闭包:在 php 5.3 中可用

         foreach($groups as &$users){
             $users = array_filter($users, function ($a) { return isset($a["image"]) && file_exists($a["image"]); });
         }
        

        没有闭包

         function hasImage($a){ return isset($a["image"]) && file_exists($a["image"]); }
         foreach($groups as &$users){
             $users = array_filter($users, "hasImage");
         }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-14
          • 1970-01-01
          • 2013-06-05
          • 1970-01-01
          • 2011-11-07
          • 2015-09-30
          • 2013-05-12
          相关资源
          最近更新 更多