Questa è una semplice domanda di programmazione, derivante dalla mia scarsa conoscenza di come PHP gestisce la copia e il disinserimento di array durante un ciclo foreach
. È così, ho una matrice che mi viene da una fonte esterna formattata nel modo in cui voglio cambiare. Un semplice esempio potrebbe essere:Il disinserimento dei valori dell'array durante l'iterazione salva in memoria?
$myData = array('Key1' => array('value1', 'value2'));
Ma quello che voglio sarebbe qualcosa di simile:
$myData = array([0] => array('MyKey' => array('Key1' => array('value1', 'value2'))));
così prendo il primo $myData
e formattarla come la seconda $myData
. Sto perfettamente bene con il mio algoritmo di formattazione. La mia domanda sta nel trovare un modo per conservare la memoria dato che questi array potrebbero diventare un po 'ingombranti. Quindi, durante il mio ciclo foreach
copio i valori dell'array corrente nel nuovo formato, quindi annullo il valore con cui sto lavorando dall'array originale. Es .:
$formattedData = array();
foreach ($myData as $key => $val) {
// do some formatting here, copy to $reformattedVal
$formattedData[] = $reformattedVal;
unset($myData[$key]);
}
è la chiamata alla unset()
una buona idea qui? Ad esempio, conserva memoria dato che ho copiato i dati e non ho più bisogno del valore originale? Oppure, PHP esegue automaticamente la raccolta dei dati poiché non faccio riferimento in alcun codice successivo?
Il codice funziona correttamente e finora i miei set di dati sono stati di dimensioni troppo ridotte per verificare le differenze di prestazioni. Solo non so se mi sto preparando per alcuni bug strani o successi della CPU in seguito.
Grazie per eventuali approfondimenti.
-sR
A meno che le strutture dei dati non siano assolutamente enormi (una grande parte della RAM), non ti preoccupi di nulla. Se php esaurisce una memoria, te lo dirà, e puoi aumentarla in php.ini. – Ian
È un'idea * stupida *. Hai appena introdotto un effetto collaterale che potrebbe essere dimenticato in seguito per qualche * micro-ottimizzazione *: -/E no, PHP (e nessun altro linguaggio GC standard che conosco) è in grado di rendere i dati * contenuti * in un struttura dati disponibile per il recupero mentre esiste un riferimento al * container * (questo esclude nozioni come riferimenti soft/deboli). Il 'unset' può/causerà l'avvio del GC di PHP, ma le prestazioni effettive ottenute - se del caso - a causa della pressione della memoria rilasciata non sono banali da generalizzare. Se questo * diventa * un problema, * allora * indirizzarlo. –
qual è la dimensione di questo array? –