Esta es una pregunta de programación simple, que proviene de mi falta de conocimiento de cómo PHP maneja la copia y el desarmado de matrices durante un ciclo foreach
. Es así, tengo una matriz que viene de una fuente externa formateada de una manera que quiero cambiar. Un ejemplo sencillo sería:¿Desea desactivar los valores de la matriz durante la iteración de guardar en la memoria?
$myData = array('Key1' => array('value1', 'value2'));
Pero lo que quiero sería algo así como:
$myData = array([0] => array('MyKey' => array('Key1' => array('value1', 'value2'))));
así que tomo el primer $myData
y darle formato como el segundo $myData
. Estoy totalmente de acuerdo con mi algoritmo de formateo. Mi pregunta radica en encontrar una manera de conservar la memoria, ya que estos arreglos pueden ser un poco difíciles de manejar. Por lo tanto, durante mi ciclo foreach
copio los valores de la matriz actual (es) en el nuevo formato, luego desarmo el valor con el que estoy trabajando desde la matriz original. Ej .:
$formattedData = array();
foreach ($myData as $key => $val) {
// do some formatting here, copy to $reformattedVal
$formattedData[] = $reformattedVal;
unset($myData[$key]);
}
es el llamado a unset()
una buena idea aquí? Es decir, ¿conserva memoria ya que he copiado los datos y ya no necesito el valor original? O, ¿PHP recolecta basura de forma automática, ya que no hago referencia a ella en ningún código posterior?
El código funciona bien, y hasta ahora mis conjuntos de datos han sido demasiado insignificantes para probar las diferencias de rendimiento. Simplemente no sé si me estoy preparando para errores extraños o hits de CPU más adelante.
Gracias por cualquier idea.
-sR
A menos que sus estructuras de datos sean absolutamente enormes (una gran fracción de su RAM), entonces no se está preocupando por nada. Si php se queda sin mentor, se lo dirá, y puede aumentarlo en php.ini. – Ian
Es una * idea tonta *. Acabas de introducir un efecto secundario que podría olvidarse más tarde por alguna * micro-optimización *: -/Y no, PHP (ni ningún otro lenguaje estándar de GC que yo conozca) es capaz de hacer que los datos * contenidos * en una estructura de datos disponible para reclamación mientras existe una referencia al * contenedor * (esto excluye nociones como referencias blandas/débiles). El 'desarmado' puede/hará que el PHP GC se active, pero el rendimiento real obtenido, si lo hay, debido a la presión de la memoria liberada no es trivial para generalizar. Si esto * se convierte en * un problema, * entonces * diríjalo. –
¿cuál es el tamaño de esta matriz? –