PHP - циклы и ресурсы Foreach - PullRequest
       31

PHP - циклы и ресурсы Foreach

4 голосов
/ 16 ноября 2009

Я использую цикл foreach для обработки большого набора элементов, к сожалению, он использует много памяти. (вероятно, потому что это делает копию массива). По-видимому, есть способ сэкономить память с помощью следующего кода: $items = &$array;

Не лучше ли вместо этого использовать for петли?

И есть ли способ уничтожить каждый элемент, как только он будет обработан в цикле foreach.

например.

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

Я просто ищу лучший способ обработки большого количества элементов без исчерпания ресурсов.

Ответы [ 4 ]

6 голосов
/ 16 ноября 2009

Попробуйте цикл for:

$keys = array_keys($array);
for ($i=0, $n=count($keys); $i<$n; ++$i) {
    $item = &$array[$keys[$i]];
    dosomethingwithmy($item);
    destroy($item);
}
4 голосов
/ 16 ноября 2009

С точки зрения ресурсов ваш код будет более эффективным, если вы будете использовать цикл for вместо цикла foreach. Каждая итерация вашего цикла foreach будет копировать текущий элемент в память, что потребует времени и памяти. Использование for и доступ к текущему элементу с индексом немного лучше и быстрее.

1 голос
/ 16 ноября 2009

Если вы получаете такой большой набор данных из базы данных, это может помочь вам попытаться использовать набор данных, как только он поступит из базы данных. Например, из документации php mysql_fetch_array .

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

этот цикл не будет создавать в памяти копию всего набора данных (по крайней мере, без избыточности). Моя подруга ускорила некоторые из ее обработки запросов в 10 раз, используя эту технику (ее наборы данных являются биологическими, поэтому они могут стать довольно большими).

1 голос
/ 16 ноября 2009

используйте это:

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

}

потому что foreach создайте копию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...