エンティティとその子を含む多次元配列から順序なしリストを作成する際に問題があります。問題は、ツリーが非常に深くなり、再帰によってサーバーに不要な負荷が発生する可能性があるため、再帰を使用したくないことです。
これはそのような配列の例です ( title
andを含むように簡略化されてchildren
おり、エンティティはオブジェクトにすることもできます)。
$array = array(
array('title' => '1', 'children' => array()),
array('title' => '2', 'children' => array()),
array('title' => '3', 'children' => array()),
array('title' => '4', 'children' => array(
array('title' => '41', 'children' => array()),
array('title' => '42', 'children' => array()),
array('title' => '43', 'children' => array()),
array('title' => '44', 'children' => array(
array('title' => '441', 'children' => array()),
array('title' => '442', 'children' => array()),
array('title' => '443', 'children' => array()),
array('title' => '444', 'children' => array(
array('title' => '4441', 'children' => array()),
array('title' => '4442', 'children' => array()),
array('title' => '4443', 'children' => array())
)),
)),
array('title' => '45', 'children' => array())
)),
array('title' => '5', 'children' => array()),
array('title' => '6', 'children' => array(
array('title' => '61', 'children' => array()),
array('title' => '62', 'children' => array()),
array('title' => '63', 'children' => array())
)),
array('title' => '7', 'children' => array())
);
ここでSOについていくつかの調査を行って、私が望むものに非常に近いこのソリューションを思いつきました:
<html>
<head></head>
<body>
<ul>
<?php
$stack = $array;
$i = 0;
$counts = array();
while(!empty($stack)) {
$node = array_shift($stack);
echo "<li>{$node['title']}";
if($node['children']) {
echo "<ul>";
$counts[] = count($node['children']);
$node['children'] = array_reverse($node['children']);
foreach($node['children'] as $ch)
array_unshift($stack, $ch);
}
if(!empty($counts)) {
end($counts);
if($counts[$key] == 0) {
echo "</ul>";
array_pop($counts);
} else {
$counts[$key]--;
}
}
if(!$node['children']) {
echo "</li>";
}
// just to make sure we won't end in infinite loop
$i++;
if($i == 50) break;
}
?>
</ul>
</body>
</html>
出力は以下のとおりです。ご覧のとおり、問題は</ul>
サブツリーを閉じることだけです。私の質問: 私はそれを考えすぎているのでしょうか、それとも盲目で明らかな間違いに気付かないのでしょうか? 有限の解決策に私を押し進めてくれますか、それともあなた自身のものを与えてくれますか?
出力:
- 1
- 2
- 3
- 4
- 41
- 42
- 43
- 44
- 441
- 442
- 443
- 444
- 4441
- 4442
- 4443
- 45
- 5
- 6
- 61
- 62
- 63
- 7