J'ai le code suivant:
if ($_POST['submit'] == "Next") {
foreach($_POST['info'] as $key => $value) {
echo $value;
}
}
Comment puis-je faire démarrer la fonction foreach à partir de la 2ème clé du tableau?
Pour les tableaux raisonnablement petits, utilisez array_slice pour en créer un deuxième:
foreach(array_slice($_POST['info'],1) as $key=>$value)
{
echo $value;
}
foreach(array_slice($_POST['info'], 1) as $key=>$value) {
echo $value;
}
Alternativement, si vous ne voulez pas copier le tableau, vous pouvez simplement le faire:
$isFirst = true;
foreach($_POST['info'] as $key=>$value) {
if ($isFirst) {
$isFirst = false;
continue;
}
echo $value;
}
Ne pourriez-vous pas simplement désinstaller le tableau ...
Donc, si j'avais un tableau où je ne voulais pas la première instance, je pourrais simplement:
unset($array[0]);
et cela supprimerait l'instance du tableau.
Si vous travailliez avec un tableau normal, je dirais d'utiliser quelque chose comme
foreach (array_slice($ome_array, 1) as $k => $v {...
mais, puisque vous regardez une demande d'utilisateur, vous n'avez aucune garantie réelle sur l'ordre dans lequel les arguments peuvent être renvoyés - un navigateur/proxy peut changer son comportement ou vous pouvez simplement décider de modifier votre formulaire dans le futur. Quoi qu'il en soit, il est dans votre intérêt d'ignorer l'ordre du tableau et de traiter les valeurs POST comme une carte de hachage non ordonnée, vous laissant deux options:
unset
la clé que vous souhaitez ignorercontinue
lorsque vous voyez la clé que vous souhaitez ignoreren boucle:
if ($key == 0) //or whatever
continue;
Une autre méthode consiste à utiliser des pointeurs de tableau:
reset($_POST['info']); //set pointer to zero
while ($value=next($_POST['info']) //ponter+1, return value
{
echo key($_POST['info']).":".$value."\n";
}
Si vous êtes prêt à jeter le premier élément, vous pouvez utiliser array_shift()
. Cependant, cela est lent sur un énorme tableau. Une opération plus rapide serait
reset($a);
unset(key($a));
Sur un tableau rempli de 1000 éléments, la différence est assez minime.
Test:
<?php
function slice($a)
{
foreach(array_slice($a, 1) as $key)
{
}
return true;
}
function skip($a)
{
$first = false;
foreach($a as $key)
{
if($first)
{
$first = false;
continue;
}
}
return true;
}
$array = array_fill(0, 1000, 'test');
$t1 = time() + microtime(true);
for ($i = 0; $i < 1000; $i++)
{
slice($array);
}
var_dump((time() + microtime(true)) - $t1);
echo '<hr />';
$t2 = time() + microtime(true);
for ($i = 0; $i < 1000; $i++)
{
skip($array);
}
var_dump((time() + microtime(true)) - $t2);
?>
Sortie:
flotteur (0,23605012893677)
flotteur (0,24102783203125)
Code de travail de mon site Web pour ignorer le premier résultat, puis continuer.
<?php
$counter = 0;
foreach ($categoriest as $category) { if ($counter++ == 0) continue; ?>
Il fonctionne sur opencart également dans le fichier tpl, faites comme cela au cas où vous en auriez besoin.
Que diriez-vous quelque chose comme ça? Lisez la première clé et la première valeur à l'aide de key()
et current()
, puis (EDIT: N'utilisez pas array_shift()
pour retirer l'élément frontal du tableauarray_shift()
, il renumérote tous les indices numériques du tableau, ce que vous ne voulez pas toujours!).
<? php $ arr = array ( 'one' => "ONE !!", ' deux '=> "DEUX !!", ' trois '=> "ARBRE", 4 => "Quatrième élément", 99 => "Nous avons sauté quelques-uns ici .. " ); $ firstKey = key ($ arr); $ firstVal = current ($ arr); écho( "
OK, les premières valeurs sont $ firstKey, $ firstVal "); ####array_shift ($ arr); # élément avant 'dequeue'# MAL! renumbers! unset ($ arr [$ firstKey]); # MIEUX! Echo ("
Maintenant pour les autres "); Foreach ($ arr as $ key => $ val) { Echo ("
$ key => $ val "); } ?>
foreach($_POST['info'] as $key=>$value) {
if ($key == 0) { //or what ever the first key you're using is
continue;
} else {
echo $value;
}
}