【问题标题】:Recursive php function that turns nested array into nested html blocks将嵌套数组转换为嵌套 html 块的递归 php 函数
【发布时间】: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值”)。这是故意的吗?
  • 为什么是这个社区维基?这是一个有效的编程问题。你正在失去代表!

标签: php recursion multidimensional-array


【解决方案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_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>

【讨论】:

  • 缩进的手感很好。
  • 您可以更改 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');
        

        【讨论】:

          猜你喜欢
          • 2019-10-12
          • 1970-01-01
          • 2018-02-16
          • 1970-01-01
          • 2016-07-09
          • 1970-01-01
          • 2021-02-09
          • 1970-01-01
          • 2013-11-29
          相关资源
          最近更新 更多