Шагов цикл с ограждающих элементов, каждый Н


Я перечисляю элементы, с помощью foreach, и мне хотелось бы вложить предметы в чем-то тег Н К Н:

$i = 0;
$open = $done = TRUE;
$n = 3;
$opening = "<div>";
$closing = "</div>";
$names = array("Doc", "Marty", "George", "Lorraine", "Einstein", "Biff"); 

foreach($names as $name) { /** $condition was not a bool. My fault. */

    if($open && !($i % n)) {
        print $opening;
        $open = FALSE;
        $done = !$open;
    } elseif(!($i % n)) $done = FALSE;

    /** print element. */
    print $name;

    if(!$open && !($i % n) && !$done) {
        print $closing;
        $open = TRUE;
        $done = !$open;
    }

    $i++;

}

Вы думаете, что этот фрагмент может быть улучшена? Было бы лучше иметь меньше проверить переменные, такие как $открыть или $сделали.



2484
7
php
задан 20 января 2011 в 10:01 Источник Поделиться
Комментарии
1 ответ

Одна проблема с вашим решением является то, что он не будет печатать последнего закрытия

тег, если есть меньше, чем элементов внутри последних
.

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

function alternate($names, $n, $opening, $closing) {
$tag = TRUE;
foreach(array_chunk($names, $n) as $chunk) {
if($tag) {
print $opening;
}
foreach($chunk as $name) {
print $name;
}
if($tag) {
print $closing;
}
$tag = !$tag;
}
}

9
ответ дан 20 января 2011 в 12:01 Источник Поделиться