假设您有一个 HTML 元素数组(按照它们的出现顺序)
$array = array(
1=>array( 'level' => 1, 'element' => '<div class="parent">'),
2=>array( 'level' => 2, 'element' => '<div class="child">'),
3=>array( 'level' => 3, 'element' => '<span class="child2">'),
4=>array( 'level' => 2, 'element' => '<div class="child">'),
5=>array( 'level' => 2, 'element' => '<div class="child">'),
6=>array( 'level' => 3, 'element' => '<span class="child2">'),
7=>array( 'level' => 4, 'element' => '<span class="child3">'),
);
你如何设计一个foreach
循环来找到关闭的HTML 标签的位置来输出一个字符串作为
<div class="parent">
<div class="child">
<span class="child2">
<span>
</div>
<div class="child">
</div>
<div class="child">
<span class="child2">
<span class="child3">
</span>
</span>
</div>
</div>
我的尝试是这样的
foreach($array as $e){
echo $e['element'];
$level = $e['level'];
if($level<=$previous_level) {
echo $closing;
$closing = '';
}
$closing.= '</'. $element . '>'; // which comes from parsed $e['element'];
$previous_level = $level;
}
最佳答案
你可以用栈来做,
$array = array(
1=>array( 'level' => 1, 'element' => '<div class="parent">'),
2=>array( 'level' => 2, 'element' => '<div class="child">'),
3=>array( 'level' => 3, 'element' => '<span class="child2">'),
4=>array( 'level' => 2, 'element' => '<div class="child">'),
5=>array( 'level' => 2, 'element' => '<div class="child">'),
6=>array( 'level' => 3, 'element' => '<span class="child2">'),
7=>array( 'level' => 4, 'element' => '<span class="child3">'),
);
$result = "";
$tags = []; // stack to store node end tag
$levels = []; // stack to store node level
foreach($array as $tag){
$level = $tag["level"];
$element = $tag["element"];
while(end($levels) >= $level){ // pop all Sibling and their child
array_pop($levels);
$result .= array_pop($tags);
}
$result .= str_pad("",$level-1,"\t") . $element . "\n";
array_push($tags, str_pad("",$level-1,"\t") . "</" .substr($element,1,strpos($element," ")-1) . ">\n");
array_push($levels,$level);
}
while(end($levels)){
array_pop($levels);
$result .= array_pop($tags);
}
echo $result;
结果,
php test.php
<div class="parent">
<div class="child">
<span class="child2">
</span>
</div>
<div class="child">
</div>
<div class="child">
<span class="child2">
<span class="child3">
</span>
</span>
</div>
</div>
关于php - 用于从 PHP 数组创建 HTML 标记的 foreach 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57440940/