Как с помощью цикла foreach правильнее вывести элементы массива в html верстке?
Обычно циклом выводят повторяющиеся элементы, например 
<h4>заголовок1</h4>
<div>блок1</div>

<h4>заголовок2</h4>
<div>блок2</div>

<h4>заголовок3</h4>
<div>блок3</div>

и тогда имея массив
$arr = array(array('title' => 'заголовок1', 'block' => 'блок1'),
array('title' => 'заголовок2', 'block' => 'блок2'),
array('title' => 'заголовок3', 'block' => 'блок3'));

можно его вывести с помощью цикла 
foreach($arr as $item){
echo '<h4>' . $item['title'] .'</h4>';
echo '<div>' . $item['block'] .'</div>';
}

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