2013-09-29 6 views
0

У меня есть столкновение сообщений, которые я хочу показать в таблице. Каждое сообщение имеет id и parent_id.php foreach в foreach

Я хочу, чтобы петля через стол с вложенным foreach, но я не получаю его на работу. Моя идея состоит в том, чтобы прокручивать каждое сообщение, печатать имя и прочее, а также находить все его дочерние элементы (путем циклического прохождения каждого сообщения и видеть, равен ли родительский идентификатор childs моему id.)

Мой код is:

$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, первый будет работать правильно.

Почему это происходит и как его решить?

ADDED: Само сообщение похоже на сообщение в блоге, оно содержит следующее: id, title, body, compact, parent_id. Где id - это уникальный идентификатор, заголовок и тело в качестве заголовка и тела для сообщения в блоге, компактное как краткое имя, используемое для URL-адреса, родительский идентификатор, указывающий, кому принадлежит сообщение, т.е. Я ребенок моего родителя.

Поскольку пользователь должен иметь возможность передвигаться по сообщениям и помещать сообщения в меню, подумайте о сообщениях верхнего уровня в качестве пунктов меню и о том, у кого есть родительский элемент подменю.

+1

Что содержит '$ childPost',' $ allPosts'? Каково отношение? –

+0

$ allPosts = $ posts, просто чтобы переменные были разными, хотя это одни и те же записи. childpost (который не должен быть childpost, если его parent_id == current_id), является просто именем сообщения, которое я получаю для каждого. Каждое сообщение содержит имя, id, parent_id, контент, URL-адрес и другие мелкие вещи. Подумайте об этом, как о блоге. Это имеет смысл? – Malin

+0

@Malin, если вы разместите некоторый образец содержимого '$ posts;', нам будет легко понять вашу проблему. –

ответ

0

по какой-то причине Еогеасп сделал не работайте над объектом $ 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-> name;' все это сработало, так как он должен был. Кроме этого, я только добавил разрыв строки к выходу. Я могу опубликовать код, который я пробовал, если вам это нужно. – 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 не требуется. Если вы пытаетесь пропустить каждый дочерний элемент, вам необходимо использовать $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

, что не работает для меня, поскольку $ posts - это вектор, содержащий все сообщения, и $ 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 на переменных, чтобы увидеть, содержат ли они неполные или неверные данные.