Итерация

foreach()

Замечание: Когда оператор foreach начинает исполнение, внутренний указатель массива автоматически устанавливается на первый его элемент. Это означает, что нет необходимости вызывать функцию reset() перед использованием цикла foreach. Так же оператор foreach() работает над копией массива, это означает, что изменения сделанные внутри цикла, не приведут к изменениям исходного массива.

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

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// массив $arr сейчас таков: array(2, 4, 6, 8)
unset($value); // разорвать ссылку на последний элемент
?>

Указатель на $value возможен, только если на перебираемый массив можно ссылаться (т.е. если он является переменной). Следующий код не будет работать:

<?php
foreach (array(1, 2, 3, 4) as &$value) {
    $value = $value * 2;
}
?>

end()

Устанавливает внутренний указатель массива на его последний элемент. Возвращает значение последнего элемента или FALSE для пустого массива.

key()

Возвращает индекс текущего элемента массива. Функция key() просто возвращает ключ того элемента массива, на который в данный момент указывает внутренний указатель массива. Он не сдвигает указатель ни в каком направлении. Если внутренний указатель указывает вне границ массива или массив пуст, key() возвратит NULL.

current()

Функция current() просто возвращает значение элемента массива, на который указывает его внутренний указатель. Она не перемещает указатель куда бы то ни было. Если внутренний указатель находится за пределами списка элементов или массив пуст, current() возвращает FALSE.

next()

Передвигает внутренний указатель массива на одну позицию вперёд. next() ведёт себя подобно current(), но с одним отличием. Перед тем, как возвратить значение элемента массива, эта функция передвигает его внутренний указатель на одну позицию вперёд. Другими словами, она возвращает следующий элемент массива и сдвигает его внутренний указатель на одну позицию.

prev()

Передвигает внутренний указатель массива на одну позицию назад. prev() ведёт себя подобно next(), за исключением того, что она передвигает внутренний указатель массива на одну позицию назад, а не вперёд.

reset()

Устанавливает внутренний указатель массива на его первый элемент. reset() перемещает внутренний указатель array к его первому элементу и возвращает значение первого элемента массива.

each()

Возвращает текущую пару ключ/значение из массива и смещает его указатель. После выполнения each(), указатель массива перемещается к следующему его элементу, пока не будет достигнут конец массива. Для повторного обхода массива при помощи each необходимо использовать функцию reset().

array_walk($array, func()) / array_walk_recursive

Применяет заданную пользователем функцию к каждому элементу массива. Не подвержена влиянию внутреннего указателя массива array. array_walk() обойдёт все элементы массива независимо от позиции указателя.

Если указан необязательный параметр userdata, он будет передан в качестве третьего параметра в callback-функцию.

<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");

function test_alter(&$item1, $key, $prefix)
{
    $item1 = "$prefix: $item1";
}

function test_print($item2, $key)
{
    echo "$key. $item2<br />\n";
}

echo "До ...:\n";
array_walk($fruits, 'test_print');

array_walk($fruits, 'test_alter', 'fruit');
echo "... и после:\n";

array_walk($fruits, 'test_print');

/*
До ...:
d. lemon
a. orange
b. banana
c. apple
... и после:
d. fruit: lemon
a. fruit: orange
b. fruit: banana
c. fruit: apple
*/

?>

array_filter($array, func())

Обходит каждое значение массива array, передавая его в callback-функцию. Если callback-функция возвращает TRUE, данное значение из array возвращается в результирующий массив. Ключи массива сохраняются.

<?php
function odd($var)
{
    // является ли переданное число нечетным
    return($var & 1);
}

function even($var)
{
    // является ли переданное число четным
    return(!($var & 1));
}

$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10, 11, 12);

echo "Нечетные:\n";
print_r(array_filter($array1, "odd"));
echo "Четные:\n";
print_r(array_filter($array2, "even"));

/*
Нечетные:
Array
(
    [a] => 1
    [c] => 3
    [e] => 5
)
Четные:
Array
(
    [0] => 6
    [2] => 8
    [4] => 10
    [6] => 12
)
*/

?>

Использование array_filter() без callback-функции:

<?php

$entry = array(
             0 => 'foo',
             1 => false,
             2 => -1,
             3 => null,
             4 => ''
          );

print_r(array_filter($entry));

/*
Array
(
    [0] => foo
    [2] => -1
)
*/
?>

list()

Подобно array(), это не функция, а языковая конструкция. list() используется для того, чтобы присвоить списку переменных значения за одну операцию. Возвращает присвоенный массив.

<?php

$info = array('кофе', 'коричневый', 'кофеин');

// Составить список всех переменных
list($drink, $color, $power) = $info;
echo "$drink - $color, а $power делает его особенным.\n";

// Составить список только некоторых из них
list($drink, , $power) = $info;
echo "В $drink есть $power.\n";

// Или только третья
list( , , $power) = $info;
echo "Мне нужен $power!\n";

// list() не работает со строками
list($bar) = "abcde";
var_dump($bar); // NULL
?>

Замечание: list() работает только с массивами, индексами которых являются числа и нумерация которых начинается с 0.