如何从具有未知嵌套级别的嵌套数组列表中呈现定义列表

时间:2014-08-19 16:09:14

标签: php iterator nested-loops

我正在尝试从数据库数据中呈现FAQ列表。数据库结果集包含一个数组列表(顶级类别),每个类别包含一组Q +以下称为faqs或另一组类别,后面称为children

我想迭代结果集,并且,当找到'children'元素时,为找到的类别呈现以下外部标记。

<div>
   <section>category title</section>

   <!-- In case this category has children, render this block here again 
   to show the sub-categories list under this category -->

   <!-- In case this category has no children, but faqs, render the topics -->
</div>

http://pastebin.com/czckiNUx我粘贴了迭代数据集的样子。

我从几个嵌套的foreach循环开始,发现嵌套级别可能是无穷无尽的(因为理论上可以创建嵌套在(子)类别下所需的子类别)并立即想知道如何捕获这种情况并提出这个理论上未知的嵌套水平。

我浏览了这个平台并阅读了几个主题。 this one并尝试调整实现,但坚持理解这些迭代器的使用。我对迭代器的体验几乎为零,当我浏览the PHP manual时,我感到有些迷茫,因为我不知道从哪里开始,或者更好地如何将这些可能性结合起来以实现工作。

虽然我尝试调整linked topic中的解决方案,但我发现$iterator忽略了所有children - 和faqs - 这些元素本身就是数组并且不明白为什么。它仅输出字符串和数字等简单类型数据。我不明白为什么并且想知道我必须如何正确地实现它。

需要评估每个迭代元素,并检查它是否属于类别标题,类别描述,类别ID或子类别/常见问题集合。

$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($data));

foreach ($iterator as $key => $value)
{
   if ($key == 'children')
   {
      // sub-categories found, find the faqs-elements and render the markup
      // this element might contain further sub-categories (children-elements)
   }
   elseif ($key == 'faqs')
   {
      // collection of Q+As found ... iterate them and render the markup
      // the iteration can't go any deeper
   }
}

我如何正确实施?

1 个答案:

答案 0 :(得分:0)

这是一个将遍历您的数据结构并打印出信息的函数;你可以按照自己的意愿调整它:

function iterate(&$array_of_aas)
{   // we have an array of associative arrays.
    // $x is the associative array
    foreach ($array_of_aas as $x)
    {   echo "Found level " . $x['level'] . " with ID " . $x['id'] . "\n";

        if(isset($x['children'])) {
            // found some sub-categories! Iterate over them.
            iterate($x['children']);
        }
        elseif (isset($x['faqs'])) {
            echo "Found some FAQS!\n";
            // collection of Q+As found ... iterate them and render the markup
            // the iteration can't go any deeper
            foreach ($x['faqs'] as $faq) {
                echo 'ID: ' . $faq['id'] . ", category: " . $faq['catid'] . "\n" . $faq['title'] . "; " . $faq['description'] . "\n";
            }
        }
    }
}