2013-09-29 262 views
0

我有一個帖子的碰撞,我想在表中顯示。 每篇文章都有一個id和一個parent_id。php foreach在foreach

我想通過嵌套的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,標題和正文作爲博客文章的標題和正文,compact是用於url的簡短名稱,是用於告知帖子正躺在誰的父ID,即。我是我父母的孩子。

由於用戶應該有所有可能性來移動帖子並將帖子放在菜單中,所以將頂級帖子視爲菜單項,並且將父級視爲子菜單項。

+1

'$ childPost','$ allPosts'包含什麼?關係是什麼? –

+0

$ allPosts = $帖子,只是爲了使變量不同,即使它是相同的帖子。 的childpost(其中doesn't必須是childpost除非其PARENT_ID == current_id),是後我得到的每一個的只是名字。 每個帖子包含姓名,身份證,PARENT_ID,內容,URL以及其他次要的東西。把它看作是一篇博客文章。這有道理嗎? – Malin

+0

@Malin如果您發佈的'$帖子一些樣本內容;',它會變得容易讓我們理解您的問題 –

回答

0

出於某種原因,該做的foreach不適用於我的Controller傳遞給我的視圖的$ 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.. 
    } 
} 
+0

我想你的代碼的財產後,我糾正錯字'$ cihldPost->名;'它的所有工作,如它應該。除此之外,我只在輸出中添加換行符。如果您需要,我可以發佈我嘗試過的代碼。 – sudee

+0

是的請做,我也糾正了類型,並沒有得到它的工作,除了我上面提供的解決方案 – Malin

2

My idea is to loop through each post, print the name and stuff, and also find all it´s children (by looping through each post and see if the childs parent id is equal to my id.)

目前,您只是試圖再次循環同一個對象。 $allPosts變量不是必需的。如果您嘗試循環訪問每個子元素,則需要在嵌套的foreach循環內使用$post

你目前做:

$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?  
      } 
     } 
    } 
} 
+0

補充說,不爲我工作,因爲$帖子是一個包含所有帖子的載體,以及$ post是一個僅包含自己的實際帖子 – Malin

+0

@Malin:你是不是想循環遍歷所有帖子?那麼你到底想用嵌套的foreach做什麼呢? –

+0

是,通過所有的後 第一循環:帖子打印的名字。然後打印的名字,我孩子的 – Malin

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以查看它們是否包含不完整或不正確的數據。