【问题标题】:PHP Arrays, appending depth of array item recursively to an array with the key of 'depth'PHP数组,将数组项的深度递归地附加到具有“深度”键的数组中
【发布时间】:2010-09-30 21:57:06
【问题描述】:

根据最底部的示例数组,我希望能够将每个嵌入数组的深度附加到数组内部。例如:

大批 ( 53 => 大批 ( '标题' => '家', '路径' => '', '类型' => '118', 'pid' => 52, '有孩子' => 0, ),

根据下面显示的示例数组,深度为 1,因此它现在应该如下所示:

大批 ( 53 => 大批 ( '标题' => '家', '路径' => '', '类型' => '118', 'pid' => 52, '有孩子' => 0, '深度' => 1, ),

等等……

我所做的所有递归数组函数尝试都非常尴尬。但是,我查看了具有 getDepth 函数的 RecursiveArrayIterator 。我对如何将它附加到当前数组感到困惑......非常感谢任何帮助,谢谢。

大批 ( 'title' => '网站导航', '路径' => '', '类型' => '115', 'pid' => 0, '有孩子' => 1, '孩子' => 大批 ( 53 => 大批 ( '标题' => '家', '路径' => '', '类型' => '118', 'pid' => 52, '有孩子' => 0, ), 54 => 大批 ( '标题' => '特征', '路径' => '特征', '类型' => '374', 'pid' => 52, '有孩子' => 1, '孩子' => 大批 ( 59 => 大批 ( '标题' => '艺术', '路径' => '功能/艺术', '类型' => '374', 'pid' => 54, '有孩子' => 1, '孩子' => 大批 ( 63 => 大批 ( '标题' => '画廊', '路径' => '特色/艺术/画廊', '类型' => '374', 'pid' => 59, '有孩子' => 1, '孩子' => 大批 ( 65 => 大批 ( '标题' => '图形', '路径' => '功能/艺术/画廊/图形', '类型' => '118', 'pid' => 63, '有孩子' => 0, ), 67 => 大批 ( 'title' => '混合媒体', '路径' => '功能/艺术/画廊/混合媒体', '类型' => '118', 'pid' => 63, '有孩子' => 0, ), 64 => 大批 ( '标题' => '概述', '路径' => '特色/艺术/画廊', '类型' => '118', 'pid' => 63, '有孩子' => 0, ), 68 => 大批 ( '标题' => '摄影', '路径' => '特色/艺术/画廊/摄影', '类型' => '118', 'pid' => 63, '有孩子' => 0, ), 66 => 大批 ( '标题' => '传统', '路径' => '特色/艺术/画廊/传统', '类型' => '118', 'pid' => 63, '有孩子' => 0, ), ), ), 62 => 大批 ( '标题' => '概述', '路径' => '功能/艺术', '类型' => '118', 'pid' => 59, '有孩子' => 0, ), 69 => 大批 ( '标题' => '教程', '路径' => '功能/艺术/教程', '类型' => '374', 'pid' => 59, '有孩子' => 1, '孩子' => 大批 ( 71 => 大批 ( '标题' => '按类别', '路径' => '功能/艺术/教程/按类别/', '类型' => '118', 'pid' => 69, '有孩子' => 0, ), 72 => 大批 ( '标题' => '按日期', '路径' => '功能/艺术/教程/按日期/', '类型' => '118', 'pid' => 69, '有孩子' => 0, ), 70 => 大批 ( '标题' => '概述', '路径' => '功能/艺术/教程', '类型' => '118', 'pid' => 69, '有孩子' => 0, ), ), ), ), ), 58 => 大批 ( '标题' => '概述', '路径' => '特征', '类型' => '118', 'pid' => 54, '有孩子' => 0, ), 61 => 大批 ( '标题' => '项目/实验室', '路径' => '功能/项目实验室/', '类型' => '374', 'pid' => 54, '有孩子' => 0, ), 60 => 大批 ( 'title' => '网络开发', '路径' => '功能/网络开发', '类型' => '374', 'pid' => 54, '有孩子' => 1, '孩子' => 大批 ( 74 => 大批 ( '标题' => '文章', '路径' => '功能/网络开发/文章/', '类型' => '374', 'pid' => 60, '有孩子' => 0, ), 73 => 大批 ( '标题' => '概述', '路径' => '功能/网络开发', '类型' => '118', 'pid' => 60, '有孩子' => 0, ), 75 => 大批 ( '标题' => '教程', '路径' => '功能/网络开发/教程', '类型' => '374', 'pid' => 60, '有孩子' => 0, ), ), ), ), ), 55 => 大批 ( '标题' => '活动', '路径' => '活动', '类型' => '374', 'pid' => 52, '有孩子' => 0, ), 56 => 大批 ( '标题' => '博客', '路径' => '博客', '类型' => '374', 'pid' => 52, '有孩子' => 0, ), 57 => 大批 ( '标题' => '关于', '路径' => '关于', '类型' => '374', 'pid' => 52, '有孩子' => 1, '孩子' => 大批 ( 76 => 大批 ( '标题' => '作者', '路径' => '关于/作者', '类型' => '118', 'pid' => 57, '有孩子' => 0, ), 77 => 大批 ( '标题' => '网站', '路径' => '关于/网站', '类型' => '118', 'pid' => 57, '有孩子' => 0, ), ), ), ), ), ); print_r($example); ?>

【问题讨论】:

    标签: php arrays recursion associative-array


    【解决方案1】:

    这样的递归函数应该可以做到吗?

    function setDepth(&$a, $depth)
    {
        $a['depth']=$depth;
        foreach($a as $key=>$value)
        {
            if (is_array($value))
               setDepth($a[$key], $depth+1);
        }
    
    }
    

    需要注意的是,数组是通过引用传递的,这样我们就可以修改它了。请注意,我们还在对 setDepth 的递归调用中使用此引用。虽然我使用 foreach 是为了方便,但 $value 变量是一个副本,将其传递给 setDepth 只会在 foreach 循环范围内进行短暂的更改。

    【讨论】:

    • 这是数组的通用递归函数。这个例子需要做一些工作。
    • 我修改了您的代码以使其正常工作。不知道怎么发。
    【解决方案2】:

    这样的事情应该可以解决问题:

    function setdepth($arr, $depth = 0)
    {
        foreach ($arr as $key => $val)
        {
            $arr[$key]['depth'] = $depth;
            if ($arr[$key]['hasChildren'])
            {
                setdepth(&$arr[$key]['children'], $depth+1);
            }
        }
    }
    

    如果您的数组以索引而不是值开头,我会更容易,因此示例用法可能是这样的:

    $arr[0] = $website;
    setdepth(&$arr, 0);
    

    其中网站是您示例中的数组

    【讨论】:

    • @youdontmeanmuch - 你有什么错误吗?结果在 $arr 变量中
    【解决方案3】:

    我假设您的示例代码中没有包含另一个数组(位于顶部。 像这样?

    function array_set_depth($array, $depth = -1)
    {
      $subdepth = $depth + 1;
      if ($depth < 0) {
        foreach ($array as $key => $subarray) {
          $temp[$key] = array_set_depth(($subarray), $subdepth);
        }
      }
      if ($array['hasChildren'] && isset($array['children'])) {
        foreach ($array['children'] as $key => $subarray) {
          $temp[$key] = array_set_depth($subarray, $subdepth);
        }
        $array['children'] = $temp;
      }
      $array['depth'] = $depth;
      return $array;
    }
    

    示例用法,我将您的数组设置为值 $a:

    $b = array_set_depth($a);
    print_r($b);
    

    编辑:

    要在孩子们之前设置深度以获得良好的打印效果,您可以这样做:

    function array_set_depth($array, $depth = -1)
    {
      $subdepth = $depth + 1;
      if ($depth < 0) {
        foreach ($array as $key => $subarray) {
          $temp[$key] = array_set_depth(($subarray), $subdepth);
        }
        return $temp;
      }
      $array['depth'] = $depth;
      if ($array['hasChildren'] && isset($array['children'])) {
        foreach ($array['children'] as $key => $subarray) {
          $temp[$key] = array_set_depth($subarray, $subdepth);
        }
        unset($array['children']);
        $array['children'] = $temp;
      }
      return $array;
    }
    

    【讨论】:

      【解决方案4】:

      修改 Pauls 代码以用于此示例。

      function setDepth(&$a, $depth = -1)
      {
          if (($depth > -1) && !($depth % 2))
            $a['depth']= $depth / 2;
          foreach($a as $key=>$value)
          {
              if (is_array($value))
                 setDepth($a[$key], $depth+1);
          }
      
      }
      setDepth($a);
      print_r($a);
      

      【讨论】:

        【解决方案5】:

        这可能会有所帮助:

        function extend( $arr, $myArr=array() ) {
        
            foreach( $arr as $key => $value ) {
                if( is_array( $key ) ) {
                    extend( $arr[ $key ] );
                } else {
                    $myArr[ $key ] = $arr[ $key ];
                }
            }
        
            return $myArr;
        }
        

        函数称为“扩展”,因为它不仅可以将数组复制到新数组中,还可以扩展现有数组。

        要扩展一个数组,你应该把它作为第二个参数,否则放一个空数组。 函数 lopps 通过数组属性检查它是否是一个数组,如果它再次被函数调用,否则它将值复制到另一个数组并返回它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-31
          • 2010-10-06
          • 1970-01-01
          • 2015-11-08
          • 2014-11-21
          • 2011-12-14
          • 1970-01-01
          相关资源
          最近更新 更多