2013-05-10 10 views
13

Ho una domanda piuttosto semplice ma sono bloccato. Sono abbastanza nuovo per php e ho un array come questo:inserire il valore php in array di matrici utilizzando foreach

$array = array(
    'one' => 1, 
    'two' => array('key1' => 'val1','key2' => 'val2'), 
    'three' => array('key1' => 'val1','key2' => 'val2'), 
    'four' => array('key1' => 'val1','key2' => 'val2') 
); 

e per ciascuna delle matrici nella matrice (vale a dire, 'due, 'tre', e 'a quattro'), voglio inserisci 'key3' => 'val3' in quegli array.

ho provato questo:

foreach($array as $item) { 
    if (gettype($item) == "array") { 
     $item['key3'] = 'val3'; 
    } 
} 

Ma non funziona, e non so perché. Usando vari print_r dappertutto, sembra di inserire 'key3' => 'val3' in $ item se lo stampo nel loop, ma la matrice originale sembra invariata. Ho anche provato un ciclo regolare, ma non ha funzionato.

+0

fare la chiave e il suo valore sono uguali per ogni sotto-array? – SaidbakR

+0

curioso perché non hai fatto 'foreach ($ array come $ item_key => $ item) {$ array [$ item_key] ['key3'] = 'val3'; } ' – westcoast

risposta

20

foreach opere con una copia del $item, quindi non è possibile modificare la matrice originale all'interno del foreach. Un modo per ovviare a questo problema è utilizzare l'operatore &.

foreach($array as &$item) { 
    if (is_array($item)) { 
     $item['key3'] = 'val3'; 
    } 
} 

altro, modo più elegante sarebbe di usare array_walk():

array_walk($array, function (&$v, $k) { 
    if (is_array($v)) { 
     $v['key3'] = 'val3'; 
    } 
}); 

Questo esempio funzionerà da PHP 5.3, in cui sono stati introdotti Chiusure.

+0

$ l'articolo è generato solo per il ciclo. Intendi '& $ array ['key3'] = 'val3';'! –

+0

@ moskito-x Sicuramente intendo quello che ho scritto. Questo è il punto. Controlla la pagina di manuale 'foreach' che ho collegato. – kapa

+0

Per cambiare $ l'articolo è inutile. Sarà sempre sovrascritto dal ciclo successivo. –

0

PHP ha una funzione per verificare se una variabile è una matrice o meno: is_array(). Utilizzare questa:

if (is_array($item)) { ... 
0

mentre loop con foreach chiave uso come:

foreach($array as $key => $item){ 

    $array[$key]['newElement'] = "newValue"; 

} 
+1

Sebbene non sia la risposta alla domanda, ciò mi ha aiutato a comprendere meglio la relazione tra la parola '$ chiave' e' $ elemento'. –