将嵌套数组转换为嵌套 html 块的递归 php 函数

Posted

技术标签:

【中文标题】将嵌套数组转换为嵌套 html 块的递归 php 函数【英文标题】:Recursive php function that turns nested array into nested html blocks 【发布时间】:2010-12-18 12:41:22 【问题描述】:

我正在寻找编写一个递归 php 函数,该函数将调用一个函数来生成嵌套的 html 块(不一定只有 DIV)。例如,对于以下数组:

$a = array(
    'b' => 'b value',
    'c' => 'c value',
    'd' => array(
        'd1' => array(
            'd12' = 'd12 value'
        ),
        'd2' => 'd2 value'
    ),
    'e' => 'e value'
);

还有下面的函数

function block( $key ) 
    return '<div>'.$key.'</div>';

会导致

<div>
    key - b
</div>
<div>
    key - c
</div>
<div>
    key - d
    <div>
        key - d1
        <div>
            key - d12
        </div>
    </div>
    <div>
        key - d2
    </div>
</div>
<div>
    key - e
</div>

【问题讨论】:

您似乎没有在任何地方使用这些值(例如“b值”)。这是故意的吗? 为什么是这个社区维基?这是一个有效的编程问题。你正在失去代表! 【参考方案1】:

请原谅粗略的格式和非常粗略的缩进方式,但它应该像你上面的格式那样工作。注意 in_array(...) 的使用

代码

nestdiv($a);

function nestdiv($array, $depth = 0) 
    $indent_str = str_repeat(" ", $depth);

    foreach ($array as $key => $val) 
        print "$indent_str<div>\n";
        print "$indent_strkey - $key\n";
        if (is_array($val))
            nestdiv($val, ($depth+1));
        print "$indent_str</div>\n";
    

输出

<div>
key - b
</div>
<div>
key - c
</div>
<div>
key - d
    <div>
    key - d1
        <div>
        key - d12
        </div>
    </div>
    <div>
    key - d2
    </div>
</div>
<div>
key - e
</div>

【讨论】:

缩进的手感很好。 您可以更改 str_repeat(' ',$depth) 的第一个迭代器 in_array() 还是 is_array()【参考方案2】:

怎么样

<pre>
<?php print_r($myArray); ?>
</pre>

【讨论】:

【参考方案3】:
function block($a) 
    $ret = '<div>';
    if(is_array($a)) 
        foreach($a as $k => $v)
            $ret .= block($v); 
     else 
        $ret .= $a;
    
    $ret .= '</div>';
    return $ret;
   

【讨论】:

【参考方案4】:
function block($array)

    $s = '';
    foreach ($array as $key=>$value)
    
        $s .= '<div>' . $key ;
        if (is_array($value))
            $s .= block($value);
        else
            $s .= $value;
        $s .= '</div>';
    
    return $s;

echo block($a);

【讨论】:

【参考方案5】:
function divArray($array)
    foreach($array as $key => $value)
       echo "<div>";
       echo $key;
       if(is_array($value))
          divArray($value);
       
       else
         echo "$value";
      
       echo "</div>";
  

【讨论】:

只有在不是数组时才关闭 div。【参考方案6】:

其他答案没有考虑到他希望能够将block()函数作为参数:

function toNested($array, $blocFunc) 
    $result = '';

    foreach ($array as $key => $value) 
        if is_array($value)
            $nestedElement = toNested($value, $blocFunc);
        else
            $nestedElement = $blocFunc($key)

        $result .= $nestedElement;
    

    return $result;


echo toNested($a, 'block');

【讨论】:

以上是关于将嵌套数组转换为嵌套 html 块的递归 php 函数的主要内容,如果未能解决你的问题,请参考以下文章

PHP在连接键时将嵌套数组转换为单个数组?

PHP遍历函数将单个数组转换为带有子元素的嵌套数组 - 基于父ID

如何使用 PHP 将日期数组转换为 3 级嵌套列表

递归实现驼峰下划线相互转换,支持多层嵌套对象

PHP将单维数组转换为嵌套数组

需要处理嵌套列表时如何将递归转换为迭代?