Распределить результаты foreach () по двум столбцам таблицы - PullRequest
1 голос
/ 08 марта 2012

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

Мне нужно это:
результат1 результат2
результат3 результат4 ​​

но я получаю это:
результат1 результат1
результат2 результат2

<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>';

next ($tag); 
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>

Ответы [ 2 ]

5 голосов
/ 08 марта 2012

Вы должны попытаться упростить ваш код при отладке .Это поможет вам изолировать проблему и упростить для таких сообществ, как 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 ().

0 голосов
/ 03 октября 2013

Если оба столбца в точности совпадают или особенно если вам нужно больше 2, я рекомендую этот сжатый подход (я не проводил много испытаний по этому вопросу):

            <table>
                <tr>
            <?php
            $count = 0;
            $columnCount = 2;
            foreach ($interests as $interest) {
                if($count++ % $columnCount == 0){
                    echo "</tr><tr>";
                }
                echo "<td>$interest->name</td>";
            }
            while($count++ % $columnCount != 0){
                echo "<td>&nbsp;</td>";
            }
            ?>
                </tr>
            </table>

Он не будет правильно обрабатывать пустой массив, поэтому вы должны добавить собственный код для его обработки. Вы можете изменить значение columnCount на любое, если вам нужно более 2 столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...