PHP-массив получает следующий ключ/значение в foreach()
Я ищу способ получить следующую и следующую + пару ключ/значение в foreach(). Например:
$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL');
foreach($a AS $k => $v){
if($nextval == $v && $nextnextval == $v){
//staying put for next two legs
}
}
Ответы
Ответ 1
Вы не можете получить доступ к следующим и следующим следующим значениям.
Но вы можете сделать что-то подобное:
$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL');
$keys = array_keys($a);
foreach(array_keys($keys) AS $k ){
$this_value = $a[$keys[$k]];
$nextval = $a[$keys[$k+1]];
$nextnextval = $a[$keys[$k+2]];
if($nextval == $this_value && $nextnextval == $this_value){
//staying put for next two legs
}
}
Ответ 2
Вот один из способов сделать это:
while($current = current($a)) {
$next = next($a);
$nextnext = next($a);
// Comparison logic here
prev($a); // Because we moved the pointer ahead twice, lets back it up once
}
Пример: http://3v4l.org/IGCXW
Обратите внимание, что цикл, написанный таким образом, никогда не будет проверять последний элемент в вашем исходном массиве. Это может быть исправлено, хотя с вашей текущей логикой это, похоже, не имеет значения, поскольку нет никаких "более" элементов для сравнения последнего.
Ответ 3
Я нашел решение со сложностью O(n)
и не требует поиска через массив назад и вперед:
$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL');
// initiate the iterator for "next_val":
$nextIterator = new ArrayIterator($a);
$nextIterator->rewind();
$nextIterator->next(); // put the initial pointer to 2nd position
// initiaite another iterator for "next_next_val":
$nextNextIterator = new ArrayIterator($a);
$nextNextIterator->rewind();
$nextNextIterator->next();
$nextNextIterator->next(); // put the initial pointer to 3rd position
foreach($a AS $k => $v){
$next_val = $nextIterator->current();
$next_next_val = $nextNextIterator->current();
echo "Current: $v; next: $next_val; next_next: $next_next_val" . PHP_EOL;
$nextIterator->next();
$nextNextIterator->next();
}
Не забудьте проверить для valid()
, если вы планируете ретранслировать на $next_val
и $next_next_val
.
Ответ 4
Посмотрите на CachingIterator, как описано в этом ответе:
Загляните вперед при повторении массива в PHP
Или использовать array_keys() в другом ответе, отправленном для того же вопроса, например.
$keys = array_keys($array);
for ($i = 0; $i < count($keys); $i++) {
$cur = $array[$keys[$i]];
$next = $array[$keys[$i+1]];
}
Ответ 5
Вы не можете просто "оставаться на месте" в цикле. Я подозреваю, что вы хотите сделать что-то намного проще, чем писать пользовательские итераторы. Если вы просто хотите игнорировать записи с дублирующими ключами, затем отследите последний ключ и сравните его с текущим.
$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL');
// Prints LA NY FL
$last_v = null;
foreach ( $a as $k => $v ){
if ( $last_v == $v ) {
/**
* Duplicate value, so skip it
*/
continue;
}
echo $v.' ';
$last_v = $v;
}
Ответ 6
Забавно, я программирую PHP на протяжении десятилетия (с паузами в течение многих лет), но мне понадобилась одна-на-одну прогулочные функции всего неделю назад.
Здесь вы находитесь: next, prev, reset и т.д. См. раздел "см. также". Кроме того, проверьте array_keys()