Цикл foreach — один из самых удобных инструментов в PHP. Он позволяет обрабатывать ассоциативные массивы:

$array = ['статьи', 'вопросы', 'ответы'];
foreach ( $array as $v )
{
	echo $v . '; ';
}

# Выведет все значения массива

Такой цикл покажет:

статьи; вопросы; ответы

Для работы как со значениями так и с ключами есть расширенная форма:

$array = [
	'a' => 'статьи',
	'b' => 'вопросы',
	'c' => 'ответы'
];

foreach ( $array as $k => $v )
{
	echo $k . ': ' . $v . '; ';
}

# Выведет все ключи и значения массива

Передача по ссылке

foreach также можно использовать для работы с переменными по ссылке:

$array = ['статьи', 'вопросы', 'ответы'];
foreach ( $array as &$v )
{
	$v .= '!';
}
print_r($array);

Что увидим:

Array
(
    [0] => статьи!
    [1] => вопросы!
    [2] => ответы!
)

Однако будьте осторожны, использование переменной $v дальше в коде приведет к изменению последнего элемента массива:

$array = ['статьи', 'вопросы', 'ответы'];
foreach ( $array as &$v )
{
	$v .= '!';
}

...
$v = 1;
print_r($array);

Изменится последний элемент массива:

Array
(
    [0] => статьи!
    [1] => вопросы!
    [2] => 1
)

Лучше либо вообще не использовать такое решение, либо удалять переменную после цикла:

$array = ['статьи', 'вопросы', 'ответы'];
foreach ( $array as &$v )
{
	$v .= '!';
}
unset($v);

Производительность

Если в условии цикла использовать функцию, то она будет вызываться при каждой итерации:

$mt = microtime(1);
foreach ( range(1, 100000) as $v ) { $v = $v + 1; }
echo microtime(1) - $mt;

# Код выполнится за 0.044 секунды

Правильным решением будет объявить переменную, и использовать ее для цикла:

$mt = microtime(1);
$array = range(1, 100000);
foreach ( $array as $v ) { $v = $v + 1; }
echo microtime(1) - $mt;

# Код выполнится за 0.008 секунды

Разница во времени выполнения составит 5 раз.

Как написал один из наших читателей, и это правда, в foreach эта проблема выражена намного меньше, чем в цикле for. Реальное замедление при выполнении foreach с вложенной функцией будет составлять всего 1.2x...1.5x.