Вы должны попытаться упростить ваш код при отладке .Это поможет вам изолировать проблему и упростить для таких сообществ, как StaceOverflow , чтобы помочь вам .Выглядит это так:
<code><?php
// some fixtures for us to work with
$tags = array('foo', 'bar', 'lolo', );
?>
<pre>
<?php
// your actual issue
foreach ($tags as $tag) {
var_dump( $tag );
next( $tag );
var_dump( $tag );
}
?>
Вы бы увидели этот (неправильный) вывод, что является большой проблемой, о которой вы говорите, не так ли?;)
string(3) "foo"
string(3) "foo"
string(3) "bar"
string(3) "bar"
string(4) "lolo"
string(4) "lolo"
Подпись next () :
mixed next ( array &$array )
Это означает, что она возвращает значение любого типа из переданного массивапо ссылке.В вашем случае это применимо так:
$tag = next( $tags );
Но что произойдет, если вы вызовете next () для последнего элемента?
Эта функция может возвращать логическое значение FALSE, но может такжевернуть не булево значение, которое оценивается как FALSE.Пожалуйста, прочитайте раздел о логических значениях для получения дополнительной информации.Используйте оператор === для проверки возвращаемого значения этой функции.
Вам следует разорвать цикл for, если next возвращает false , например:
$tag = next( $tags );
if ( $tag === false ) break;
Более подробный пример:
<code><?php
class Tag {
public $tag;
public function __construct( $tag ) {
$this->tag = $tag;
}
}
$tags = array( );
foreach ( array('foo', 'bar', 'lolo', ) as $word) {
$tags[] = new Tag( $word );
}
$search = array( 'bar', 'the' );
?>
<pre>
<?php
foreach ($tags as $tag) {
var_dump( $tag );
$tag = next( $tags );
if ( $tag === false ) {
break;
}
var_dump( $tag );
}
?>
Будет выводить очень хорошо :
object(Tag)#1 (1) {
["tag"]=>
string(3) "foo"
}
object(Tag)#3 (1) {
["tag"]=>
string(4) "lolo"
}
object(Tag)#2 (1) {
["tag"]=>
string(3) "bar"
}
Вот решение , примененное к вашемукод (проверено / работает):
<table>
<?php
foreach ($tags as $tag) {
echo '<tr><td><input name="taga[]" type="checkbox" value="'.$tag->tag.'" id="'.str_replace(" ", "_", $tag->tag).'_id"';
foreach ($search as $searchword) {
if ($searchword == $tag->tag) echo 'checked="checked"';
}
echo ' /><label for="'.str_replace(" ", "_", $tag->tag).'_id">'.$tag->tag.'</label></td>';
$tag = next ($tags);
if ( $tag === false ) {
break;
}
echo '<td><input name="taga[]" type="checkbox" value="'.$tag->tag.'" id="'.str_replace(" ", "_", $tag->tag).'_id"';
foreach ($search as $searchword) {
if ($searchword == $tag->tag) echo 'checked="checked"';
}
echo ' /><label for="'.str_replace(" ", "_", $tag->tag).'_id">'.$tag->tag.'</label></td></tr>';
}
?>
</table>
Руководство по php для следующего также содержит важное примечание :
Примечание: Вы выиграли 'не сможет отличить конец массива от логического элемента FALSE.Чтобы правильно просмотреть массив, который может содержать элементы FALSE, см. Функцию each ().