Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

Взять следующий элемент ассоциативного массива на PHP

#php #массивы #foreach


Добрый день, столкнулся с такой проблемой. Есть ассоциативный массив.

К примеру.

$foo = array('x'=>'x_val','y'=>'y_val','z'=>'z_val');


И есть цикл foreach.

foreach ($foo as $key=>$val){
    //Тут какая то логика
}


Нужно взять в текущей итерации следующий $val. Ну или $key.

Как можно этого добиться ?
    


Ответы

Ответ 1



проще всего, будет использовать вспомогательный массив соответствий $foo = array('x'=>'x_val', 'y'=>'y_val', 'z'=>'z_val'); $keys = array_keys($foo); array_shift($keys); $matches = array_combine(array_keys($foo), $keys + [-1 => null]); foreach($foo as $k => $v){ $nextKey = $matches[$k]; print_r([$k, $nextKey]); } результат Array( [x] => y [y] => z [z] => ) Однако, вообще стоит задуматься, что есть порядок ключей в ассоциативном массиве, и имеет ли он в целом смысл и гарантирован ли при обходе

Ответ 2



Через array_keys и array_search, но не сказал бы что это лучший способ (в комментариях получше способ есть) $tmp = array_keys($foo); // ["1" => "x", "2" => "y" ...] foreach ($foo as $key=>$val){ $tmp_key = array_search($key, $tmp); // узнаем ключ $tmp по которому хранится значение $key $nextKey = $tmp[$tmp_key + 1]; // следующий ключ $nextValue = $foo[$nextKey]; // следующее значение echo $nextValue; }

Ответ 3



Используйте next $array = ['x' => 1, 'y' => 2, 'z' => 3]; foreach ($array as $key => $value) { $nextValue = next($array); // Что бы узнать ключ следующего значения, можно вызвать key($array); echo $value . ' ' . $nextValue . PHP_EOL; } /* Вывод: 1 2 2 3 3 */ UPD: в комментариях подсказали, что этот пример работает только в PHP 7 UPD2: Вот версия, которая работает одинаково в PHP 5 и PHP 7 $array = ['x' => 1, 'y' => 2, 'z' => 3]; while ($key = key($array) !== null) { $value = current($array); $nextValue = next($array); echo $value . ' ' . $nextValue . PHP_EOL; } /* Вывод: 1 2 2 3 3 */

Комментариев нет:

Отправить комментарий