Цикл PHP Foreach делает дополнительный шаг вперед из цикла - PullRequest
2 голосов
/ 18 июля 2010

В основном у меня есть цикл foreach в PHP, и я хочу:

foreach( $x as $y => $z )  
    // Do some stuff  
    // Get the next values of y,z in the loop  
    // Do some more stuff  

Ответы [ 6 ]

7 голосов
/ 18 июля 2010

Это не практично делать в foreach.

Для неассоциативных массивов , используйте for:

for ($x = 0; $x < count($y); $x++)
 {
   echo $y[$x];  // The current element

   if (array_key_exists($x+1, $y))
    echo $y[$x+1]; // The next element

   if (array_key_exists($x+2, $y))
    echo $y[$x+2]; // The element after next

 }

Для ассоциативных массивов это немного сложнее. Это должно работать:

$keys = array_keys($y); // Get all the keys of $y as an array

for ($x = 0; $x < count($keys); $x++)
 {
   echo $y[$keys[$x]];  // The current element

   if (array_key_exists($x+1, $keys))
    echo $y[$keys[$x+1]]; // The next element

   if (array_key_exists($x+2, $keys))
    echo $y[$keys[$x+2]]; // The element after next

 }

При доступе к одному из следующих элементов убедитесь, что они существуют!

1 голос
/ 18 июля 2010

Хорошо, в продолжение моего комментария к решению Пекки, вот тот, который принимает во внимание тот факт, что массив может быть ассоциативным.Это не красиво, но это работает.Предложения по улучшению этого приветствуются!

<?php
    $y = array(
        '1'=>'Hello ',
        '3'=>'World ',
        '5'=>'Break? ',
        '9'=>'Yup. '
    );

    $keys = array_keys($y);
    $count = count($y);

    for ($i = 0; $i < $count; $i++) {
        // Current element    
        $index = $keys[$i];
        echo "Current: ".$y[$index];  // The current element

        if (array_key_exists($i+1, $keys)) {
            $index2 = $keys[$i+1];
            echo "Next: ".$y[$index2]; // The next element
        }

       if (array_key_exists($i+2, $keys)) {
            $index3 = $keys[$i+2];
            echo "Nextnext: ".$y[$index3]; // The element after next
        }
     }
?>
1 голос
/ 18 июля 2010

Не уверен, если вы просто хотите сделать «кое-что» с первым элементом, только «еще кое-что» с последним элементом, и «кое-что» и «еще кое-что» с каждым другим элементом.Или если вы хотите сделать «кое-что» с первым, третьим, пятым элементами и «еще кое-что» со вторым, четвертым, шестым элементами и т. Д.

$i = 0;
foreach( $x as $y => $z )   
    if (($i % 2) == 0) {
       // Do some stuff   
   } else {
       // Do some more stuff 
   }
   $i++;
}
1 голос
/ 18 июля 2010

используйте ключевое слово continue, чтобы пропустить оставшуюся часть этого цикла и вернуться к началу.

0 голосов
/ 18 июля 2010
reset($arr);
while(list($firstindex,$firstvalue) = each($arr)){
   list($secondindex,$secondvalue) = each($arr);
   //do something with first & second.
}
0 голосов
/ 18 июля 2010

попробуйте что-то вроде ...

for ($i=0, $i<count($x); $i++)
{
    // do stuff with $x[$i]
    // do stuff with $x[$i+1], unless you're on the last element of the array
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...