web-dev-qa-db-fra.com

Ajouter des valeurs à un tableau dans une boucle foreach

J'essaie d'éditer un tableau à la volée, dans une boucle foreach. J'analyse en gros chaque clé et si cette clé correspond à celle que je veux, je veux ajouter une autre entrée dans le tableau immédiatement après celui-ci .

Si je prends ce code,

$values = array(
    'foo' => 10,
    'bar' => 20,
    'baz' => 30
);

foreach($values as $key => $value){
    print $value . ' ';
    if($key == 'bar'){
        $values['qux'] = 21;
    }
}

J'ai 2 problèmes,

  • d'abord, le résultat est 10 20 30 au lieu du 10 20 30 21 attendu
  • deuxièmement, même si je résous le premier problème, ma valeur sera toujours ajoutée à la fin de mon tableau

Comment pourrais-je ajouter l'entrée qux entre les noms bar et baz?

Merci pour vos idées.

7
zessx

Foreach ne parcourra pas les nouvelles valeurs ajoutées au tableau tant qu'il est à l'intérieur de la boucle.

Si vous souhaitez ajouter la nouvelle valeur entre deux valeurs existantes, vous pouvez utiliser un deuxième tableau:

$values = array(
    'foo' => 10,
    'bar' => 20,
    'baz' => 30
);
$newValues = array();
foreach($values as $key => $value) 
{
    $newValues[$key] = $value;
    if($key == 'bar') 
    {
        $newValues['qux'] = 21;
    }
}
print implode(' ', $newValue);

Aussi, voyez une de mes questions préférées sur StackOverflow traitant de la boucle foreach: Comment fonctionne PHP 'foreach'?

12
Lars Ebert

Vous pouvez utiliser le signe esperluette avant la valeur.

//populate all the promos into their promoG groups
foreach($unclaimedPromoGroups as &$unclaimedPromoGroup) {
    $_promo = new Promo();
    $_promo->promoGroupID = $unclaimedPromoGroup['promo_groupID'];
    $promo = $_promo->getGroupPromos();
    $unclaimedPromoGroup["promos"] = $promo;
}
2
Radiumrasheed

Pour cela, vous devez créer un nouveau tableau,

<?php
$values = array(
    'foo' => 10,
    'bar' => 20,
    'baz' => 30
);

$newarray = array();
foreach($values as $k => $v) 
{
    $newarray[$k] = $v;
    if($k == 'bar') 
        $newarray['qux'] = 21;
}

echo implode(' ', $newarray);

Démo:
http://3v4l.org/N4XgB

2

La solution ci-dessous utilise le même tableau.

$values = array(
    'foo' => 10,
    'bar' => 20,
    'baz' => 30
);

function match($niddle, $haystack, $Push, $offset = 0) {
    foreach(array_slice($haystack, $offset) as $key => $value) 
    {
        print $value . ' ';
        if($key == $niddle) 
        {
            $i = array_search($niddle, array_keys($haystack)) + 1;
            $haystack = array_slice($haystack, 0, $i, true) + $Push + array_slice($haystack, $i, count($haystack) - $i, true);
            $haystack = match($niddle, $haystack, $Push, $i);
            break;
        }
    }

    return $haystack;
}

$values = match('bar', $values, array('qux'=>21));

var_dump($values);
1
QHip