2012-10-23 13 views
11

Próbuję uruchomić zadanie czyszczenia danych w tablicy, w szczególności konwersji czasu epoki na YYYY-MM-DD.Dlaczego nie mogę zaktualizować danych w tablicy z pętlą foreach?

Próbowałem tej funkcji pierwotnie:

foreach ($data as $row) { 
    $row['eventdate'] = date('Y-m-d', $row['eventdate']); 
} 

echo '<pre>'; 
print_r($data); 
echo '</pre>'; 

Jednak pętla foreach nie aktualizuje dane, kiedy to wyjście.

Poniższy pętli wyszło:

for ($i=0; $i<count($data); $i++) { 
    $data[$i]['eventdate'] = date('Y-m-d', $data[$i]['eventdate']); 
} 

Dlaczego pierwsza pętla zawieść i drugiej pracy? Czyż nie są one takie same?

Odpowiedz

29

Kiedy używasz foreach pętlę w sposób, w jaki obecnie są foreach ($data as $row) {, $row jest używany „przez wartość”, a nie „przez odwołanie”.

spróbuj zaktualizować do odniesienia przez dodanie & do $row:

foreach ($data as &$row) { 
    $row['eventdate'] = date('Y-m-d', $row['eventdate']); 

Lub można użyć metody klucz/wartość:

foreach ($data as $index => $row) { 
    $data[$index]['eventdate'] = date('Y-m-d', $row['eventdate']); 
+0

Dzięki za szczegółowe wyjaśnienie i przykłady! – Choy

+1

@Choy Możesz również chcieć zobaczyć pierwsze ostrzeżenie [tutaj] (http://php.net/manual/en/control-structures.foreach.php). –

7

Początkowy przykład przekazuje tylko wiersz według wartości, a nie jako odniesienie.

Z Dokumenty

Aby móc bezpośrednio modyfikować elementy tablicy w pętli poprzedzają $ wartość z &. W tym przypadku wartość zostanie przypisana przez odniesienia

Stąd też przechodzą przez odniesienie

foreach ($data as &$row) { 
    $row['eventdate'] = date('Y-m-d', $row['eventdate']); 
} 

lub użyj bardziej wyraźne składni

foreach ($data as $key => $value) { 
    $data[$key]['eventdate'] = date('Y-m-d', $value['eventdate']); 
} 

Również ważne jest to ostrzeżenie w docs

Odesłanie do Wartość $ i ostatni element tablicy pozostają nawet po pętli foreach o numerze . Zaleca się, aby zniszczyć go wyłączonym()

Powiązane problemy