5

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

    大批 (
      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);

?>
4

5 回答 5

8

我假设还有另一个数组(在您的示例代码中未包含在顶部。像这样的东西?

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;
}
于 2009-01-12T12:06:49.137 回答
5

像这样的递归函数应该这样做吗?

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 循环范围内进行短暂的更改。

于 2009-01-12T11:42:50.667 回答
5

修改 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);
于 2009-01-12T13:20:02.500 回答
0

像这样的东西应该可以解决问题:

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);

website 是您示例中的数组

于 2009-01-12T11:56:20.453 回答
0

这可能会有所帮助:

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 通过数组属性检查它是否是一个数组,如果它再次被函数调用,否则它将值复制到另一个数组并返回它。

于 2011-12-17T01:14:15.933 回答