【发布时间】:2017-11-03 14:22:30
【问题描述】:
我想在SELF::FIRST 模式下使用RecursiveIteratorIterator 和RecursiveArrayIterator 循环遍历未知深度数组。
如果数组值是一个数组,我会打开一个 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 个<div> 标签。我不知道如何记住那里有多深。所以我可以接近一个for循环和echo</div>。
我当前的代码:
<?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->getDepth(),您可以获得迭代时所处的级别。测试其变化 -
@JakubMatczak 也许不是,但我试过了,但没有运气。
-
@splash58 感谢您的建议。我已经得到了所有的深度,但这并没有多大帮助。因为有时数组的深度会减少超过 1,我不知道下一步该做什么......