2013-05-10 12 views
13

Mam dość podstawowe pytanie, ale utknąłem. Jestem całkiem nowy, php i mam tablicę takich jak to:Wartość wstawienia php do tablicy tablic przy użyciu foreach

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

i dla każdej z tablic w tablicy (czyli „dwa«trzy»i«cztery»), chcę wstaw 'key3' => 'val3' do tych tablic.

Próbowałem to:

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

Ale to nie działa, a ja nie wiem dlaczego. Używając różnych print_r w całym miejscu, wydaje się wstawiać 'key3' => 'val3' do $ item, jeśli wydrukuję go w pętli, ale oryginalna tablica wydaje się niezmieniona. Próbowałem również regularnej pętli for, ale to też nie działało.

+0

Czy klucz, a jego wartość jest równa dla każdego sub-macierzy? – SaidbakR

+0

ciekawe dlaczego nie zrobiłeś 'foreach ($ tablica jako $ item_key => $ item) {$ array [$ item_key] ['key3'] = 'val3'; } ' – westcoast

Odpowiedz

20

foreach prace z kopią $item, więc nie można modyfikować swoją oryginalną tablicę wewnątrz foreach. Jednym ze sposobów obejścia tego problemu jest użycie operatora &.

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

Innym, bardziej elegancki sposób byłoby użyć array_walk():

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

Ten przykład zadziała od PHP 5.3, gdzie zostały wprowadzone zamknięć.

+0

Element $ jest generowany tylko dla pętli. Masz na myśli '& $ array ['key3'] = 'val3';'! –

+0

@ moskito-x Z pewnością mam na myśli to, co napisałem. Właśnie o to chodzi. Sprawdź stronę podręcznika 'foreach', która jest połączona. – kapa

+0

Aby zmienić pozycję $ jest bezużyteczna. Będzie zawsze nadpisywany przez następną pętlę. –

0

PHP ma funkcję sprawdzania, czy zmienna jest tablicą, czy nie: is_array(). Użyj tego:

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

podczas pętli foreach z kluczem wykorzystanie takich jak:

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

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

} 
+1

Chociaż nie była to odpowiedź na pytanie, pomogło mi to lepiej zrozumieć związek między słowem "$ key" i '$ item'. –

Powiązane problemy