Т.к. алгоритм не сильно понятен, но судя по комментариям нужно выводить вертикальными блоками. Не смогу проверить, но примерно так.
И старайтесь правильно задавать вопросы.
<?php if ($categories) : ?>
<div class="list">
<ul><li>
<?php
$cols = 2; // число колонок
$view = ceil( count($categories) / $cols );
$counter = 0;
foreach ($categories as $category) : ?>
<div>
<a href="<?php echo $category['href']; ?>">
<img src="<?php echo $category['thumb']; ?>" title="<?php echo $category['name']; ?>" alt="<?php echo $category['name']; ?>" />
<span><?php echo $category['name']; ?></span>
</a>
</div>
<?php
$counter++;
if( $counter == $view) {
echo "</li><li>";
$counter = 0;
?>
<?php endforeach; ?>
</li></ul>
</div>
<?php endif; ?>
Суть кода в создании нужного числа inline колонок, с вертикальным заполнением div--ами. Ну и конечно стоит оформить все это в CSS.