2012-10-23 8 views
11

Sto tentando di eseguire un processo di pulizia dei dati in un array, in particolare convertendo il tempo storico in YYYY-MM-DD.Perché non posso aggiornare i dati in un array con ciclo foreach?

Ho provato questa funzione originariamente:

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

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

Tuttavia il ciclo foreach non aggiornano i dati quando output.

Il seguente ciclo for ha funzionato:

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

Perché il primo ciclo falliscono e il secondo lavoro? Non sono gli stessi?

risposta

29

Quando si utilizza un ciclo foreach nel modo ci si trova, foreach ($data as $row) {, $row viene utilizzato "per valore", non "da riferimento".

provare ad aggiornare ad un riferimento aggiungendo il & al $row:

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

In alternativa, è possibile utilizzare il metodo chiave/valore:

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

Grazie per la spiegazione dettagliata ed esempi! – Choy

+1

@Choy Potresti anche vedere il primo avviso [qui] (http://php.net/manual/en/control-structures.foreach.php). –

7

L'esempio iniziale passa solo riga per valore e non per riferimento.

Dalla documentazione

Per poter modificare direttamente gli elementi di matrice all'interno del ciclo preceda $ valore con &. In tal caso il valore sarà assegnato da riferimento

Quindi o passaggio per riferimento

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

o utilizzare la sintassi più esplicito

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

Altrettanto importante è questo avviso in documenti

Riferimento di a Il valore $ e l'ultimo elemento dell'array rimangono anche dopo il ciclo foreach . Si consiglia di distruggerlo con unset()

Problemi correlati