Работа с итерациями в циклах

11 Декабря 2019 12:17

1. Текущая и соседние итерации

Удобнее всего работать с итерациями используя функцию current(). Эта функция возвращает текущий элемент массива. Но нужно быть аккарутным при исползовании этой функции, например, внутри foreach. Как известно, foreach на каждой итерации присваивает значение текущего элемента переменной, имя которой мы указывали при инициализации, и сразу увеличивает указатель массива на единицу.

Пример:

$array = array(
    0 => array(
    	'id' => 32,
    	'title' => 'test 1',
    	'uri' => 'test-1.html'
    ),
    1 => array(
    	'id' => 71,
    	'title' => 'test 2',
    	'uri' => 'test-2.html'
    ),
    2 => array(
    	'id' => 17,
    	'title' => 'test 3',
    	'uri' => 'test-3.html'
    ),
    3 => array(
    	'id' => 83,
    	'title' => 'test 4',
    	'uri' => 'test-4.html'
    )
);

foreach($array as $item) {
    if($item['id'] == 71) {
        return current($array);
    }
}
//вывод:
/*
    2 => array(
    	'id' => 17,
    	'title' => 'test 3',
    	'uri' => 'test-3.html'
    )
*/

В этом случае, будет возвращен элемент не с 71 идентификатором, а с 17 т.к. значение присвоилось $item и указатель увеличился, а мы возвращаем current() уже после этого потому возвращается следующий.

Правильно будет использовать с тем же массивом:

while ($item = current($array)) {
    if ($item['id'] == 17) {
        return $item;
    }
    next($array);
}

Обязательно нужно писать next($array), чтобы при несрабатывании условия осуществлялся переход к следующей итерации.