Насколько я вижу, ваш код будет генерировать новую строку (с одним столбцом) на каждой итерации.
Чтобы создать желаемую структуру, вы можете использовать временный счетчик. Я приведу вам быстрый рабочий пример (сводится к основному). Как видите, я использую оператор по модулю только для определения, есть ли у нас нечетная или четная строка.
Надеюсь, это поможет.
$posts = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$count_rows = 1;
$tmp_counter = 1;
$html = "";
foreach ($posts as $post)
{
if ($tmp_counter == 1){
$html .= '<div class="row">'; // create a new row on first run and after counter resets
}
if ( $count_rows % 2 === 1)
{
// even row >> 2 Cols
$html .= '<div class= "col-md-6">'.$post.'</div>'; // I would recommend to use a function to generate the post markup
if ($tmp_counter == 2)
{
$html .= '</div>'; // close the row
$tmp_counter = 0; // reset the temporary counter
$count_rows ++; // increase number of rows
}
}
else
{
// odd row >> 3 Cols
$html .= '<div class= "col-md-4">'.$post.'</div>'; // I would recommend to use a function to generate the post markup
if ($tmp_counter == 3)
{
$html .= '</div>'; // close the row
$tmp_counter = 0; // reset the temporary counter
$count_rows ++; // increase number of rows
}
}
$tmp_counter++;
}
if ($tmp_counter != 1){
$html .= '</div>'; // close the last row
}
echo $html;