2010-07-12 15 views
44

J'écris un foreach qui ne démarre pas à l'index 0e mais commence plutôt au premier index de mon tableau. Y a-t-il un moyen de décaler le point de départ de la boucle?Comment faire pour démarrer une boucle foreach à un index spécifique en PHP

+12

Wouldnt-il mieux si vous utilisez pour la place? – Prix

+3

La gestion des paires clé-valeur est beaucoup plus facile dans une boucle foreach et je suppose que c'est la raison pour laquelle il voulait prendre une foreach. Ou il a même un foreach et ne veut pas changer beaucoup de code. – 2ndkauboy

Répondre

2

Dans un foreach vous ne pouvez pas faire cela. Il n'y a que deux façons d'obtenir ce que vous voulez:

  1. Utilisez une boucle et commencer à la position 1
  2. utiliser un foreach et utiliser un quelque chose comme si ($ key> 0) autour de votre code réel

Un foreach fait ce que son nom vous dit. Faire quelque chose pour chaque élément :)

EDIT: OK, une solution très mauvaise est venue à l'esprit. Essayez ce qui suit:

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

Cela inverserait le tableau, sortira le dernier élément et l'inversera à nouveau. Que vous aurez un élément excluant le premier.

Mais je recommanderais d'utiliser l'une des autres solutions. Le meilleur serait le premier.

Et une variante: Vous pouvez utiliser array_slice() pour que:

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

Mais vous devez utiliser les trois paramètres pour garder les clés du tableau pour votre boucle foreach:

+0

en utilisant array_slice il est possible de le faire dans une boucle foreach, mais cette pratique devrait être fortement déconseillée et passible de la lecture de ce type de code. – Kris

+0

C'est pourquoi j'ai fait remarquer que c'est une méthode EVIL pour le faire. Mais je n'utiliserais aucune des solutoins personnellement. J'utiliserais une instruction if ou une boucle for. – 2ndkauboy

13

Vous pouvez utiliser la fonction array_slice:

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

Bien sûr, vous pouvez utiliser ce que valeur de décalage que vous voulez. Dans ce cas, 1 'ignore' le premier élément du tableau.

+0

Ne vaut rien que cela nécessitera une copie de ce morceau du tableau. Cela pourrait être une mauvaise chose si le tableau est grand. –

+0

Vous avez raison ... cela fonctionnera mieux pour les baies courtes. Merci pour votre commentaire. – Cristian

1

On dirait une boucle serait la meilleure façon d'y aller, mais si vous pensez que vous devez utiliser foreach vous pourriez passer le premier élément au tableau et revient à ses premières revenir sur:

$a = array('foo','bar'); 
$temp = array_shift($a); 
foreach ($a as $k => $v) { 
    //do something 
} 
array_unshift($a, $temp); 
+0

Notez simplement que la syntaxe '$ k => $ v' est seulement pour les tableaux associatifs. Pour les tableaux indexés, vous voulez juste '$ a as $ v'. –

+0

@Michael: le $ k => $ v fonctionnera également pour le tableau indexé et retournera le numéro d'index de la valeur courante. – 2ndkauboy

+0

Oh ... cool! : D lol –

67

Gardez simple.

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

J'aime cette solution. Est-ce que continuer est disponible avec toutes les versions de PHP? – 2ndkauboy

+1

http://ie2.php.net/manual/fr/control-structures.continue.php ne mentionne pas quand il est devenu disponible, donc je suppose qu'il a été là depuis le début. – TRiG

+1

et, si le tableau n'est pas indexé? – Cristian

27

A Foreach réinitialisera le tableau:

Note: Lorsque foreach démarre, le pointeur de la matrice interne est automatiquement remis à zéro au premier élément de la matrice. Cela signifie que vous n'avez pas besoin d'appeler reset() avant une boucle foreach.

soit utiliser une boucle for (uniquement si cela est pas un tableau associatif)

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

ou une boucle while (peut être toute matrice)

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

ou avec un LimitIterator

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

qui vous permet de spécifier le décalage de début et de compter dans le constructeur.

Toute la production de volonté au-dessus des lettres b à z au lieu de a à z

0

Eh bien pas de corps dit, mais si vous ne me dérange pas modifier le tableau et si nous voulons commencer à partir du deuxième élément de le tableau donné:

unset($array[key($array)]); 
foreach($array as $key=>$value) 
{ 
    //do whatever 
} 

si vous le permettez, il suffit d'ajouter,

$saved = $array; 
unset($array[key($array)]); 
foreach($array as $key=>$value) 
{ 
    //do whatever 
} 
$array = $saved; 

en outre, si vous voulez sauter un index connu donné, juste subtitute

key($array) 

par l'indice donné

Questions connexes