php - 用于从 PHP 数组创建 HTML 标记的 foreach 循环

标签 php html arrays multidimensional-array foreach

假设您有一个 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/

相关文章:

html - AngularJS:使用多行写入和读取文本区域

html - CSS Button 链接添加多个不同的图像

java - 根据原句子数组对句子数组进行排序

c++ - 在 C++ 中,为什么数组比 std::vector 快得多?

php - 使用 (int) 和 (double) 一起截断小数时出错

php - 是 $this->__invoke();在 PHP 中 100% 安全有效?

javascript - javascript 中的刽子手游戏玩法

php - 检查多维数组中的条件

php - 防止使用php将空数组记录提交到MYSQL数据库

C# 到 PHP base64 编码/解码