Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to start a foreach loop at a specific index in PHP

Tags:

php

I am writing a foreach that does not start at the 0th index but instead starts at the first index of my array. Is there any way to offset the loop's starting point?

like image 781
Nialls Chavez Avatar asked Jul 12 '10 15:07

Nialls Chavez


People also ask

How do I get index PHP in foreach?

Use the key Variable to Find the Foreach Index in PHP The foreach loop in PHP is used as follows. The variable value stores the value of each element of the array. Copy <? php $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); foreach ($array as $key => $value) { echo "The index is = " .

How do you get the index of the current iteration of a foreach loop?

C# Program to Get the index of the Current Iteration of a foreach Loop Using Select() Method. The method Select() is a LINQ method. LINQ is a part of C# that is used to access different databases and data sources. The Select() method selects the value and index of the iteration of a foreach loop.

Is PHP foreach by reference?

This is an example why pass-by-reference in foreach loops is BAD. This is because when the second loop executes, $entry is still a reference. Thus, with each iteration the original reference is overwritten.


5 Answers

Keep it simple.

foreach ($arr as $k => $v) {
   if ($k < 1) continue;
   // your code here.
}

See the continue control structure in the manual.

like image 76
TRiG Avatar answered Oct 05 '22 09:10

TRiG


A Foreach will reset the array:

Note: When foreach first starts executing, the internal array pointer is automatically reset to the first element of the array. This means that you do not need to call reset() before a foreach loop.

Either use a for loop (only if this is not an associative array)

$letters = range('a','z');
for($offset=1; $offset < count($letters); $offset++) {
    echo $letters[$offset];
}

or a while loop (can be any array)

$letters = range('a','z');
next($letters);
while($letter = each($letters)) {
    echo $letter['value'];
}

or with a LimitIterator

$letters = new LimitIterator(new ArrayIterator(range('a','z')), 1);
foreach($letters as $letter) {
    echo $letter;
}

which lets you specify start offset and count through the constructor.

All of the above will output the letters b to z instead of a to z

like image 42
Gordon Avatar answered Oct 05 '22 10:10

Gordon


You can use the array_slice function:

$arr = array(); // your array
foreach(array_slice($arr, 1) as $foo){
   // do what ever you want here
}

Of course, you can use whatever offset value you want. In this case, 1 'skip' the first element of the array.

like image 25
Cristian Avatar answered Oct 05 '22 09:10

Cristian


In a foreach you cant do that. There are only two ways to get what you want:

  1. Use a for loop and start at position 1
  2. use a foreach and use a something like if($key>0) around your actual code

A foreach does what its name is telling you. Doing something for every element :)

EDIT: OK, a very evil solution came just to my mind. Try the following:

foreach(array_reverse(array_pop(array_reverse($array))) as $key => $value){
    ...
}

That would reverse the array, pop out the last element and reverse it again. Than you'll have a element excluding the first one.

But I would recommend to use one of the other solutions. The best would be the first one.

And a variation: You can use array_slice() for that:

foreach(array_slice($array, 1, null, true) as $key => $value){
    ...
} 

But you should use all three parameters to keep the keys of the array for your foreach loop:

like image 38
2ndkauboy Avatar answered Oct 05 '22 08:10

2ndkauboy


Seems like a for loop would be the better way to go here, but if you think you MUST use foreach you could shift the first element off the array and unshift it back on:

$a = array('foo','bar');
$temp = array_shift($a);
foreach ( $a as $k => $v ) {
  //do something
}
array_unshift($a, $temp);
like image 23
Robert Swisher Avatar answered Oct 05 '22 10:10

Robert Swisher