wake-up-neo.com

Fügen Sie einem Array in einer foreach-Schleife Werte hinzu

Ich versuche, ein Array in einer foreach-Schleife im laufenden Betrieb zu bearbeiten. Im Grunde analysiere ich jeden Schlüssel, und wenn dieser Schlüssel mit dem übereinstimmt, den ich möchte, möchte ich einen weiteren Eintrag im Array unmittelbar nach diesem hinzufügen.

Wenn ich diesen Code nehme,

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

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

Ich habe 2 Probleme,

  • zuerst ist die Ausgabe 10 20 30 anstelle des erwarteten 10 20 30 21.
  • zweitens, selbst wenn ich das erste Problem löse, wird mein Wert immer noch am Ende meines Arrays hinzugefügt

Wie kann ich den qux-Eintrag zwischen bar und baz hinzufügen?

Danke für deine Ideen.

7
zessx

Foreach durchläuft keine neuen Werte, die dem Array hinzugefügt wurden, während er sich innerhalb der Schleife befindet.

Wenn Sie den neuen Wert zwischen zwei vorhandenen Werten hinzufügen möchten, können Sie ein zweites Array verwenden:

$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);

Siehe auch eine meiner Lieblingsfragen in StackOverflow zur Foreach-Schleife: Wie funktioniert PHP 'foreach' eigentlich?

12
Lars Ebert

Sie können das kaufmännische Und-Zeichen vor dem Wert verwenden.

//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

Dafür müssen Sie ein neues Array erstellen,

<?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);

Demo:
http://3v4l.org/N4XgB

Die Lösung unten verwendet das gleiche Array.

$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