the_tags tag name first codex all php for-loop resources foreach

tag - PHP-Bucles y recursos de Foreach



the_tags wordpress (4)

Estoy usando un bucle Foreach para procesar un gran conjunto de elementos, desafortunadamente está usando mucha memoria. (probablemente porque está haciendo una copia de la matriz). Aparentemente hay una manera de guardar algo de memoria con el siguiente código: $items = &$array;

¿No es mejor utilizar for bucles en su lugar?

¿Y hay una forma de destruir cada elemento tan pronto como se hayan procesado en un ciclo foreach?

p.ej.

$items = &$array; foreach($items as $item) { dosomethingwithmy($item); destroy($item); }

Solo busco la mejor manera de procesar una gran cantidad de elementos sin agotar los recursos.


En lo que respecta a recursos, su código será más eficiente si utiliza un ciclo for, en lugar de un ciclo foreach. Cada iteración de su ciclo foreach copiará el elemento actual en la memoria, lo que llevará tiempo y memoria. Usar y acceder al elemento actual con un índice es un poco mejor y más rápido.


Pruebe un ciclo for :

$keys = array_keys($array); for ($i=0, $n=count($keys); $i<$n; ++$i) { $item = &$array[$keys[$i]]; dosomethingwithmy($item); destroy($item); }


Si obtiene ese gran conjunto de datos de una base de datos, a menudo puede ayudar a tratar de consumir el conjunto de datos tan pronto como proviene de la base de datos. Por ejemplo, de la documentación php mysql_fetch_array .

$resource = mysql_query("query"); while ($row = mysql_fetch_array($resource, MYSQL_NUM)) { process($row); }

este bucle no creará una copia en la memoria de todo el conjunto de datos (al menos no de forma redundante). Una amiga mía aceleró un 10% de su procesamiento de consultas utilizando esta técnica (sus conjuntos de datos son biológicos, por lo que pueden llegar a ser bastante grandes).


utilizar esta:

reset($array); while(list($key_d, $val_d) = each($array)){ }

porque foreach crea una copia