Циклы и разбивка по колонкам

Еще одна полезность на заметку… Вот бывает вы получаете N количество записей и надо это набить в колонки. Здесь есть как минимум два варианта и есть в результатах тонкости. Заодно мы и рассмотрим применение кратности для выполнения этой задачи.

Рассмотрим два варианта.

Вариант 1.

$arr = array('Адлер', 'Александров', 'Анапа', 'Белгород', 'Галич', 'Гатчина', 'Елец', 'Дубна', 'Киров');
$cols = 2;
$count = count($arr);
$i = 1;
$output = "<ul>"; 
    foreach($arr as $a){
        $output .= "\n\t<li>{$a}</li>";
        if($i%$cols == '0' AND $i < $count){
            $output .= "\n</ul>\n<ul>";
        }
        $i++;
    }
$output .= "\n</ul>";
print $output;

Результат:

<ul>
	<li>Адлер</li>
	<li>Александров</li>
</ul>
<ul>
	<li>Анапа</li>
	<li>Белгород</li>
</ul>
<ul>
	<li>Галич</li>
	<li>Гатчина</li>
</ul>
<ul>
	<li>Елец</li>
	<li>Дубна</li>
</ul>
<ul>
	<li>Киров</li>
</ul>

Здесь самое главное — это проверка кратности индекса текущего элемента iиколичестваколонокi и количества колонок cols. Если поменяем кол-во колонок в переменной $cols, то получим и соответствующее количество колонок на выходе. В итоге мы получили по два города на строчку. Но здесь есть момент — города по порядку расположены горизонтально, что не есть удобно, так как удобней, когда порядок идет вертикально по колонкам. Посмотрим второй пример:

$arr = array('Адлер', 'Александров', 'Анапа', 'Белгород', 'Галич', 'Гатчина', 'Елец', 'Дубна', 'Киров');
$cols = 2;
$count = count($arr);
$i = 1;
$output = "<ul>";  
    foreach($arr as $a){
        $output .= "\n\t<li>{$a}</li>";
        if($i < $count AND $i%ceil($count/$cols) == '0'){
            $output .= "\n</ul>\n<ul>";
        }
        $i++;
    } 
$output .= "\n</ul>";
print $output;

Вот здесь уже результат такой:

<ul>
	<li>Адлер</li>
	<li>Александров</li>
	<li>Анапа</li>
	<li>Белгород</li>
	<li>Галич</li>
</ul>
<ul>
	<li>Гатчина</li>
	<li>Елец</li>
	<li>Дубна</li>
	<li>Киров</li>
</ul>

То есть у нас здесь четко две колоночки, в каждой из которых записей примерно поровну. (Визуальное оформление уже само собой на совести CSS).