PHP / Mysql array_pop отсутствует первое значение

В основном происходит следующее:

Человек идет в определенную галерею, скажем GalleryID = 42. Я делаю запрос, чтобы захватить все изображения в этой галерее (со значением GalleryID = 42) и сделать отдельный запрос, чтобы захватить все комментарии, связанные с этой галереей (например GalleryID = 42). Всего может быть всего 4 комментария на 3 разных изображениях из 400 изображений.

Когда я просматриваю изображения с помощью цикла do / while и просматриваю их, я просматриваю массив комментариев, которые были помещены для каждого изображения, когда он петли. Если он находит идентификатор изображения, соответствующий определенному изображению, он отображает значения комментариев (Comment, CommentAuthor и CommentDate).

Вот запрос для изображений:

SELECT * FROM GalleryData WHERE GalleryID = 42 

И запрос для комментариев:

 SELECT Comment, CommentAuthor, CommentDate, ID FROM Comments WHERE CategoryID=42 

Затем я использую этот код для размещения комментариев в повторном запросе:

 while(($Comments[] = mysql_fetch_assoc($rsComments)) || array_pop($Comments)); 

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

 foreach($Comments as $comment) { if($comment['ID'] == $row_rsGalleries['ID']) { echo '<p>'.$comment['Comment'].' - '.$comment['CommentAuthor'].'</p>'; } } 

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

Теперь это один из первых проектов, которые я сделал с этим, и я не эксперт php / mysql, новичок.

Когда я запускаю запрос, он имеет 4 результата, но массив содержит только 3, первый результат отсутствует.

Эта конструкция выглядит совершенно сумасшедшей для меня. Я не понимаю, почему он отрезал бы первый элемент, но я действительно не чувствую склонности даже тратить время, чтобы узнать: вам нужно исправить это утверждение. Используя || в этом контексте никогда не даст вам результат, который вы хотите.

Можете ли вы описать, что это должно делать?

Зачем вам нужен поп-код?

 while($rsComment = mysql_fetch_assoc($rsComments)) { $Comments[] = $rsComment; } 

Разве это не делает все, что вам нужно, с тем, чтобы быть намного более многословным?

Редактировать Причина, по которой ваш код не работает, заключается в том, что while вычисляет false, чтобы остановить цикл, он запускает array_pop, и это удаляет 1 элемент из массива.

mysql_fetch_assoc возвращает ассоциативный массив, который соответствует mysql_fetch_assoc строке, если есть строки, и возвращает false если больше строк нет.

Так

 while(($Comments[] = mysql_fetch_assoc($rsComments)) || array_pop($Comments)); 

будет выглядеть так:

 while(true || array_pop($Comments)); 

для первых 4 строк. Теперь || короткое замыкание, поп не происходит. После этого, когда больше не осталось строк, mysql_fetch_assoc возвращает false который попадает в массив, а затем array_pop который удаляет последний добавленный элемент ( false ).

Так эффективно || array_pop($Comments) || array_pop($Comments) удаляет окончательное логическое значение, вставляемое в массив, гарантируя, что массив имеет только строки, возвращаемые mysql_fetch_assoc .

Я не могу понять, как это работает вообще.

Сначала я предположил, что он заполнит массив значениями bool , но, подумав об этом, цикл никогда не должен заканчиваться .

Он в конечном итоге будет равен while(($array[] = array_pop($array))); , и для непустого массива это будет вращаться навсегда :

Следующие никогда не заканчиваются:

 <?php // Simulate MySQL_fetch_assoc; return false when no more results function fetch($results) { if (count($results)) return array_pop($results); return false; } $Comments = array(); $rsComments= array(array(3), array(4), array(5), array(6)); while (($Comments[] = fetch($rsComments) || array_pop($Comments))); // $Comments = array(true,true,true,true,true,...); 

Вы должны поставить счетчик; например: $ counter = 3 Затем оператор while содержит этот счетчик, например:

while ($ count <3) {(Ваш счет начинается с 0, так что, хотя у вас есть в общей сложности 4 элемента, 0 считается одним из них. Ваша программа будет считать только до 3 с вашим массивом.)

Я не могу ничего исправить в вашем коде, потому что я слишком новичок в программировании, но, по крайней мере, это поможет вам избежать бесконечного цикла.