0

我有一些我想在表格中显示的帖子。每个帖子都有一个 id 和一个 parent_id。

我想用嵌套的 foreach 遍历表,但我没有让它工作。我的想法是遍历每个帖子,打印名称和内容,并找到它的所有孩子(通过遍历每个帖子并查看孩子的父 ID 是否等于我的 ID。)

我的代码是:

$allPosts = $posts;
foreach ($posts as $post) {
    if ($post->parent_id == 0){ //0 means highest level, no parent
        echo $post->name;
        $current_id = $post->id;

        foreach ($allPosts as $childPost){
            if($childPost->parent_id == $current_id){
                echo $cihldPost->name;

            }   
        }
    }
}

问题是,第一个循环只运行一次。如果我删除第二个 foreach 循环,第一个会正确运行。

为什么会发生这种情况,我该如何解决?

添加:帖子本身就像一篇博客文章,它包含以下内容:id、title、body、compact、parent_id。其中 id 是唯一的 id,title 和 body 作为博客文章的标题和正文,compact 作为用于 url 的短名称,一个父 id,用于告诉该文章位于谁之下,即。我是我父母的孩子。

由于用户应该有可能在帖子中移动并将帖子放在菜单中,因此可以将顶级帖子视为菜单项,而将父级帖子视为子菜单项。

4

3 回答 3

2

我的想法是遍历每个帖子,打印名称和内容,并找到它的所有孩子(通过遍历每个帖子并查看孩子的父 ID 是否等于我的 ID。)

目前,您只是试图再次遍历同一个对象。该$allPosts变量不是必需的。如果您尝试遍历每个子元素,则需要$post在嵌套foreach循环内使用。

你目前正在做:

$obj2 = $obj;
foreach ($obj as $child) {
    foreach ($obj2 as $anotherchild) {
    # code...
    }
}

大致上,结构应该如下所示:

foreach ($obj as $child) {
    foreach ($child as $secondchild) {
      # code...
    }
}

使用您的代码:

foreach ($posts as $post) {
    if ($post->parent_id == 0){ //0 means highest level, no parent
        echo $post->name;
        $current_id = $post->id;

        foreach ($post as $childPost){
            if($childPost->parent_id == $current_id){
                echo $cihldPost->name; // <-- typo?    
            }   
        }
    }
}
于 2013-09-29T11:30:31.880 回答
0

由于某种原因,foreach 不适用于我的控制器传递给我的视图的 $posts 对象本身。但是,如果我将 $posts 保存在本地数组中,则一切正常。我仍然不知道为什么我首先会遇到问题,所以请对此发表评论或提供更好的答案。

    $mylist = array();
foreach($posts as $post) {
    $listitem = array();
    $listitem['id'] = $post->id;
    $listitem['parent_id'] = $post->parent_id;
    $listitem['title'] = $post->title;
    $listitem['compact'] = $post->compact;
    $mylist[] = $listitem;
}
foreach($mylist as $listitem){
    #code..
    foreach($mylist as $inneritem){
         #code..
    }
}
于 2013-09-29T12:32:36.137 回答
0

以下是我更改您的代码的方式:

$posts = array(
    (object) array("parent_id" => 0, "id" =>  1, "name" => 'Outer 1'),
    (object) array("parent_id" => 0, "id" =>  2, "name" => 'Outer 2'),
    (object) array("parent_id" => 0, "id" =>  3, "name" => 'Outer 3'),
    (object) array("parent_id" => 0, "id" =>  4, "name" => 'Outer 4'),
    (object) array("parent_id" => 0, "id" =>  5, "name" => 'Outer 5'),
    (object) array("parent_id" => 1, "id" =>  6, "name" => 'Inner 1.1'),
    (object) array("parent_id" => 1, "id" =>  7, "name" => 'Inner 1.2'),
    (object) array("parent_id" => 4, "id" =>  8, "name" => 'Inner 4.1'),
    (object) array("parent_id" => 5, "id" =>  9, "name" => 'Inner 5.2'),
    (object) array("parent_id" => 5, "id" => 10, "name" => 'Inner 5.2'),
    (object) array("parent_id" => 5, "id" => 11, "name" => 'Inner 5.3'),

);

$allPosts = $posts;
foreach ($posts as $post) {
    if ($post->parent_id == 0){ //0 means highest level, no parent
        echo $post->name . ' : ';
        $current_id = $post->id;

        foreach ($allPosts as $childPost){
            if($childPost->parent_id == $current_id){
                echo $childPost->name . ', ';
            }
        }
        echo '<br>';
    }
}

输出以下内容:

Outer 1 : Inner 1.1, Inner 1.2, 
Outer 2 : 
Outer 3 : 
Outer 4 : Inner 4.1, 
Outer 5 : Inner 5.2, Inner 5.2, Inner 5.3, 

如果问题不在您的代码中(这对我来说看起来不错,并且在我的计算机上也可以按预期工作),它可能在$posts数组的结构中。尝试并使用var_dump变量来查看它们是否包含不完整或不正确的数据。

于 2013-10-04T20:31:02.533 回答