Чем array_walk лучше foreach?
Сделайте тоже самое, только запихните не $item = 'hello!'; а что-то посложнее и разница будет меньше.
Ну и банально избежать дублирование кода. function test_print($item2, $key) 
{
    echo "$key. $item2<br />\n";
}
array_walk($array1, 'test_print');
array_walk($array2, 'test_print');
array_walk($array3, 'test_print');
array_walk($array4, 'test_print');
array_walk($array5, 'test_print');
//вот тебе новая выгода:
$func_name = 'test_print';
array_walk($array5, $func_name);
Прикиньте это c foreach
В целом foreach и if else творят чудеса и позволяют сделать что угодно. А порой это даже быстрее работает. Но выглядит не читабельно, по сути не гибко и т.д.
Не знаток именно PHP. Но как минимум отличие в том, что во втором случае вызывается функция при каждой итерации цикла. На вызов функции тоже тратится время.