递归多维数组到HTML嵌套代码

时间:2017-03-12 02:24:44

标签: php arrays recursion multidimensional-array tree

我尝试使用递归函数从PHP中的多维数组创建嵌套的HTML代码块。但是我似乎无法以嵌套顺序打印标签。

这是原始数组:



$array_1 = 
		  array
		  (
			  array
				  (
					  'id' => '1',
					  'tag' => 'div1',
					  'parent' => '0'
				  ),
					  
			  array
				  (
					  'id' => '2',
					  'tag' => 'div2',
					  'parent' => '1'
				  ),
			  array
				  (
					  'id' => '3',
					  'tag' => 'div3',
					  'parent' => '2'
				  ),
			  array
				  (
					  'id' => '4',
					  'tag' => 'div4',
					  'parent' => '2'
				  ),
			  array
				  (
					  'id' => '5',
					  'tag' => 'div5',
					  'parent' => '0'
				  ),
			  array
				  (
					  'id' => '6',
					  'tag' => 'div6',
					  'parent' => '5'
				  ),
			  array
				  (
					  'id' => '7',
					  'tag' => 'div7',
					  'parent' => '0'
				  )
		  );




我要做的第一件事是使用一个函数将这个数组转换成一个多维数组,方法是使用每个记录的父元素作为参考构建树结构:



function buildTree(array $elements, $parentId = 0) {
    
	$branch = array();

    foreach ($elements as $element) 
	{
        if ($element['parent'] == $parentId) 
		{
            $children = buildTree($elements, $element['id']);
            
			if ($children) 
			{
                $element['children'] = $children;
            }
			
			$branch[] = $element;
        }
    }

    return $branch;
}

$tree_1 = buildTree($array_1);




完成此操作后,多维数组应如下所示:



Array
(
    [0] => Array
        (
            [id] => 1
            [name] => div1
            [parent] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [name] => div2
                            [parent] => 1
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 3
                                            [name] => div3
                                            [parent] => 2
                                        )

                                    [1] => Array
                                        (
                                            [id] => 4
                                            [name] => div4
                                            [parent] => 2
                                        )

                                )

                        )

                )

        )

    [1] => Array
        (
            [id] => 5
            [name] => div5
            [parent] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 6
                            [name] => div6
                            [parent] => 5
                        )

                )

        )

    [2] => Array
        (
            [id] => 7
            [name] => div7
            [parent] => 0
        )

)




接下来要做的是以嵌套顺序输出html元素。在这个例子中,我使用符号标签名称,如div1,div2等;但实际上它们可以是任何html标签,如div,h1,ul,li,form等;打开和关闭标签。

为了实现这一点,我使用了以下递归函数,但是我的问题是它没有按照嵌套顺序显示html元素。



function recursive($array, $level = 0)
{
    foreach($array as $key => $value)
	{
        
		if (!is_array($value) && $key == "tag") { echo str_repeat(" ", $level), "[".$value."]", ''; }
		
		//If $value is an array.
        if(is_array($value))
		{
			//We need to loop through it.
            recursive($value, $level + 1);
        } 
		else
		{
            //It is not an array, so print it out.			
			if ($key == "tag") { echo "[/".$value."]", '<br>'; }
						
        }
    }
}

$tree_2 = recursive($tree_1);

echo $tree_2;
&#13;
&#13;
&#13;

这是它当前从数组中输出html标签的方式:

&#13;
&#13;
[div1][/div1]

   [div2][/div2]

     [div3][/div3]

     [div4][/div4]

 [div5][/div5]

   [div6][/div6]

 [div7][/div7]
&#13;
&#13;
&#13;

这就是html标签应该如何根据多维数组的嵌套顺序输出(请注意一些div标签如何在其结束元素之前包含其他div标签):

&#13;
&#13;
[div1]
   [div2]
     [div3][/div3]
     [div4][/div4]
   [/div2]
[/div1]
 
[div5]
   [div6][/div6]
[/div5]
 
[div7][/div7]
&#13;
&#13;
&#13;

如何以正确的嵌套顺序打印html标签,如上例所示?我错过了什么?非常感谢!

2 个答案:

答案 0 :(得分:0)

问题是密钥var products = document.QuerySelectorAll("div.product"); foreach (var product in products) { var productTitle = product.ChildNodes .First(o => o.NodeType == AngleSharp.Dom.NodeType.Text && o.TextContent.Trim() != ""); Console.WriteLine(productTitle.TextContent.Trim()); } 位于tag数组中的children之前。

虽然我会亲自改变您的数据结构,使其更容易&#34;要在递归函数中使用,您可以更改$tree_1函数,使其工作如下:

recursive

在必要时添加其他换行符和格式

答案 1 :(得分:0)

重写你的功能:

function recursive2($array, &$level, $indentClosingTag = true)
{
  $level++;
  for($i = 0; $i<count($array); $i++) {
    $data = $array[$i];
    $indent = str_repeat('&nbsp;', $level);

    echo $indent . "[".$data['tag'].']';
    if (isset($data['children'])) {
      echo '<br>';
      $level++;
      recursive2($data['children'], $level, true);
      $level--;
    } else {
      $indentClosingTag = false;
    }
    echo ($indentClosingTag ? $indent : ''). "[/".$data['tag'].']'.'<br>';
  }
  $level--;    
}

$l = 0;
recursive2($tree_1, $l);