2009-11-19 126 views
4

我正在寻找可以调用函数来生成嵌套HTML块(不一定只有DIV)的递归php函数。因此,例如,对于下面的数组:将嵌套数组转换为嵌套html块的递归php函数

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

您似乎没有在任何地方使用这些值(例如, 'b值')。这是故意的吗? – 2009-11-19 22:31:49

+1

为什么这个社区wiki?这是一个有效的编程问题。你失去代表! – 2009-11-19 22:35:59

回答

7

借口粗格式和缩进你的非常粗糙的方式,但它应该工作,你在前面已经格式化。注意使用in_array(...)

CODE

nestdiv($a); 

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

    foreach ($array as $key => $val) { 
     print "$indent_str<div>\n"; 
     print "${indent_str}key - $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> 
+0

缩进是一个很好的接触。 – notJim 2009-11-19 22:40:45

+0

您可以更改str_repeat('',$ depth)的第一个迭代器 – Sergi 2009-11-19 22:42:30

+0

它是** in_array()**还是** is_array()**? – user3888958 2017-08-30 09:12:52

1

怎么样

<pre> 
<?php print_r($myArray); ?> 
</pre> 
0
function divArray($array){ 
    foreach($array as $key => $value){ 
     echo "<div>"; 
     echo $key; 
     if(is_array($value)){ 
      divArray($value); 
     } 
     else{ 
     echo "$value"; 
     } 
     echo "</div>"; 
    } 
} 
+0

当你不是数组时,你只关闭div。 – Sergi 2009-11-19 22:37:25

+0

哎呀!你是对的。纠正。 – GSto 2009-11-19 22:43:49

0
function block($a) { 
    $ret = '<div>'; 
    if(is_array($a)) { 
     foreach($a as $k => $v) 
      $ret .= block($v); 
    } else { 
     $ret .= $a; 
    } 
    $ret .= '</div>'; 
    return $ret; 
} 
0
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); 
+0

哎呀Sergi打我... – Ben 2009-11-19 22:38:24

0

其他的答案并没有考虑到,他希望能够在事实以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');