【问题标题】:foreach loop for creating a HTML markup from a PHP array用于从 PHP 数组创建 HTML 标记的 foreach 循环
【发布时间】:2019-12-17 20:06:42
【问题描述】:

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

【问题讨论】:

  • 到目前为止你尝试了什么?
  • @RakeshJakhar 我尝试在循环时将结束标记存储在字符串/数组中,但无法在正确的时间释放存储的结束标记。
  • 所以...给我们看一些代码。
  • @Marcel 我添加了一个简化代码供您参考。
  • 你为什么不把它们当作一棵树排序并递归呢?更容易

标签: php html arrays multidimensional-array foreach


【解决方案1】:

这是我使用递归函数的解决方案:

$array = array(
    1 => array('level' => 1, 'element' => '<div class="parent">', 'parsedElement' => 'div'),
    2 => array('level' => 2, 'element' => '<div class="child">', 'parsedElement' => 'div'),
    3 => array('level' => 3, 'element' => '<span class="child2">', 'parsedElement' => 'span'),
    4 => array('level' => 2, 'element' => '<div class="child">', 'parsedElement' => 'div'),
    5 => array('level' => 2, 'element' => '<div class="child">', 'parsedElement' => 'div'),
    6 => array('level' => 3, 'element' => '<span class="child2">', 'parsedElement' => 'span'),
    7 => array('level' => 4, 'element' => '<span class="child3">', 'parsedElement' => 'span'),
);

function displayTree(&$tree, $level = 1) {
    if (!$tree) {
        return;
    }
    $el = array_shift($tree); // get the current element
    echo $el['element'];
    if ($tree && $tree[0]['level'] > $level) {
        // if the next item is a child of this then increase the level and process the sub-tree
        displayTree($tree, $level+1);
    }
    echo '</'. $el['parsedElement'] . '>';
    if ($tree && $tree[0]['level'] < $level) {
        return; // go back to the parent
    }
    displayTree($tree, $el['level']); // process the next sibling
}
displayTree($array);

输出:

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

【讨论】:

    【解决方案2】:

    你可以用堆栈来做,

    $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>
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多