2009-05-28 6 views
1

Existe-t-il un moyen d'itérer dans un tableau mais d'effectuer une opération sur tous les autres éléments? ie Si j'ai un tableau avec 13 éléments, comment puis-je faire quelque chose pour seulement les éléments 2,4,6,8,10 et 12?itération sélective de la matrice dans php

Répondre

0

pour fixer cletuses repondre pour plus de vitesse et de corriger les fautes de frappe:

for ($i = 1, $j = count($array); $i < $j; $i += 2) { 
    // code 
} 
+0

J'ai appris quelque chose, je ne savais pas que vous pouviez assigner plus d'une variable dans la première expression (ou les suivantes). Merci! –

+2

Vitesse? Au mieux "mettre en cache" la taille du tableau est la micro-optimisation. C'est également sémantiquement équivalent. Que faire si la taille du tableau change pendant la boucle? – cletus

+0

@phil, np. content d'aider :) @cletus, si votre tableau change pendant la boucle, vous devriez utiliser un foreach ou mettre à jour $ j dans la boucle. C'est une optimisation de vitesse et valide. Imaginez un tableau de valeurs de 1000000 puis vous voyez ce que je veux dire. – Ozzy

1
for ($i=1; $i<sizeof($array); $i+=2) { 
    // do stuff to $array[$i] 
} 

Vous pouvez l'intégrer dans une trop foreach:

$i = 0; 
foreach ($array as $v) { 
    if ($i++ & 1) continue; 
    // do stuff to $v 
} 

Note:$i & 1 est équivalent à ($i % 2) == 1 (ou tout simplement $i % 2).

+0

si la dernière partie de l'instruction est $ i + = 2? – musoNic80

+0

pas sûr d'obtenir l'exemple foreach. Pourrais-tu m'expliquer un peu plus simple ?! – musoNic80

+1

Fondamentalement, une boucle foreach(), contrairement à une boucle normale for(), n'a pas de compteur d'index, donc $ i est utilisé comme indice de substitution. Il est incrémenté à chaque itération. $ i & 1 retournera vrai pour les valeurs 1, 3, 5, 7. Il commence à 0, donc il retourne vrai pour chaque deuxième élément (ce qui veut dire les ignorer). – cletus

3
foreach($array as $val) { 
    if(($i++ % 2) == 0) { 
    ...do stuff here... 
    } 
} 
+0

Voici comment je le ferais, à l'exception des accolades. La logique est d'une simplicité déconcertante et cela reflète bien le fait qu'il est facile de l'étendre avec un autre sans réécrire la logique de la boucle. – Kris

+0

Les réponses sont super, merci. Puis-je ajouter un exemple du monde réel? J'ai un tableau qui a 2 éléments pour chaque jour de la semaine. (Numérotation commençant à 0). Je veux une boucle qui fera quelque chose sur chaque jour et non sur chaque élément. Comment puis-je utiliser les réponses que vous avez données pour y parvenir? Post-scriptum Il n'y a pas encore de code à poster, je suis juste en train d'essayer de le faire d'abord !!! – musoNic80

+0

si votre tableau est similaire $ array = array ('mon1', 'mon2', 'tue1', 'tue2' ... 'fri2'); et suit toujours un modèle distinct, alors vous pouvez utiliser ce code comme il est écrit. Si vous vouliez vous assurer qu'il se produisait tous les jours, vous auriez besoin de le valider d'une manière ou d'une autre. C'est difficile à dire sans vraiment savoir ce qui se passe et ce que vous voulez sortir. –

0

Une autre variation sur les réponses déjà affichées ... similaires à la réponse de Phil Carter. Si le tableau a un index numérique, vous pouvez l'utiliser dans foreach au lieu de gérer une variable de compteur séparée:

foreach ($array as $i => $v) { 
    if (! ($i % 2)) { 
    // do stuff to $v 
}