【问题标题】:PHP Array Iterator to DIVPHP数组迭代器到DIV
【发布时间】:2017-11-03 14:22:30
【问题描述】:

我想在SELF::FIRST 模式下使用RecursiveIteratorIteratorRecursiveArrayIterator 循环遍历未知深度数组。

如果数组值是一个数组,我会打开一个 DIV,这样“子数组”就会在这个 DIV 中。类似的东西

$array = array(
    'key0' => '0',
    'key1' => array(
        'value0' => '1',
        'value1' => '2',
    ),
    'key2' => '3',
    'key3' => array(
        'value2' => '4',
        'value3' => array(
            'value4' => '5'
        ),
        'value4' => array(
            'value5' => '6'
        ),
    ),
);

那么 HTML 应该是:

<div>
    <div>
        <p>key0 is 0</p>
    </div>
    <div>
        <p>key1</p>
        <div>
            <p>value0 is 1</p>
            <p>value1 is 2</p>
        </div>
    </div>
    <div>
        <p>key2 is 3</p>
    </div>
    <div>
        <p>key3</p>
        <div>
            <p>value2 is 4</p>
            <p>value3</p>
            <div>
                <p>value4 is 5</p>
            </div>
            <p>value4</p>
            <div>
                <p>value5 is 6</p>
            </div>
        </div>
    </div>
</div>

但问题是我的代码每次只能关闭 1 个&lt;div&gt; 标签。我不知道如何记住那里有多深。所以我可以接近一个for循环和echo&lt;/div&gt;


我当前的代码:

<?php

    echo '<div>';

    $iterator      = new RecursiveIteratorIterator(new RecursiveArrayIterator($iterator_array), RecursiveIteratorIterator::SELF_FIRST);
    $is_start      = true;
    $last_element  = '';

    foreach($iterator as $key => $value) {
        if(is_array($value) && $is_start) {

            echo '<div><p>' . $key . '</p>';

            $is_start     = false;
            $last_element = end($value);
        } elseif(is_array($value) && !$is_start) {

            echo '</div><div><p>' . $key . '</p>';

            $last_element = end($value);
        } elseif(!is_array($value)) {

            echo '<div><p>' . $key . ' is ' . $value . '</p></div>';

            if($last_element == $value) {
                echo '</div>';
            }
        }
    }

    echo '</div>';

?>

【问题讨论】:

  • 也许在 "array.lenght()" 行中使用 smthng 来检查您需要多少个 div?只是试图跳出框框思考。 (数组的长度 = 4、4 个初始 div,在数组 [key1].lenght = 2 内,然后再有 2 个 div...)
  • 你真的需要使用RecursiveIteratorIterator吗?它看起来像是一个简单的递归函数的工作。
  • 使用$iterator-&gt;getDepth(),您可以获得迭代时所处的级别。测试其变化
  • @JakubMatczak 也许不是,但我试过了,但没有运气。
  • @splash58 感谢您的建议。我已经得到了所有的深度,但这并没有多大帮助。因为有时数组的深度会减少超过 1,我不知道下一步该做什么......

标签: php arrays iterator


【解决方案1】:

使用这个递归函数

也许对你有帮助

    get_div($array);
    function get_div($arr) {
        foreach($arr as $k => $a){
            echo '<div>';
            if(is_array($a)) {
                echo "<p>".$k."</p>";
                get_div($a);
            } else {
                echo "<p>".$k." is ".$a."</p>";
            }
            echo '</div>';
        }
    }

【讨论】:

    猜你喜欢
    • 2012-01-09
    • 2017-11-19
    • 2015-11-29
    • 1970-01-01
    • 2013-11-11
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    相关资源
    最近更新 更多