В PHP foreach генерирует массив и возвращает его, что приведет к увеличению загрузки процессора - PullRequest
2 голосов
/ 02 марта 2012

У меня есть исходный массив, в цикле foreach () будет создан новый массив на основе некоторого поля исходного массива. И, наконец, функция вернет новый массив.

function get_role_info() {
    $source_array = array(
        'role1' => array(
            'name' => 'Eric',
            'age' => '30',
            'gender' => 'male'            
        ),
        'role2' => array(
            'name' => 'Emily',
            'age' => '27',
            'gender' => 'female'
        )
        ......
    );
    foreach ($source_array as $role_name => $role) {       
        $new_info= array();    
        $new_info['role-name'] = $role_name; 
        $new_storage['user-name'] = $role['name'];
        ...... //other filters

        $newinfo[] = $new_info;    
    }    

    return $newinfo;
}

Вызов этой функции значительно увеличит загрузку процессора. Если я изменю foreach на цикл for

for ($i=0; $i<$cnt; $i++) {
    ....... // same logic to filter fields
}

Загрузка ЦП снизится ... Я не уверен, в чем различия между этими двумя? Если я просто распечатаю новый массив и не верну его, процессор тоже не вырастет. У кого-нибудь есть какие-то подсказки по этому поводу? Thx.

1 Ответ

4 голосов
/ 02 марта 2012

Каждая итерация foreach возвращает копию фактических данных, которые у вас есть в массиве, если это большой массив и / или многомерный, вы работаете с скопированными данными, а затем возвращаете $newInfo, и поэтому процессор не Я не согласен с вами в этом случае.

Цикл

for, с другой стороны, просто зацикливается до тех пор, пока вы не скажете ему остановиться (например, до $i < $cnt), ему все равно, к каким изменениям вы применяете, и он, конечно, ничего не копирует куда угодно. Это просто петли.

Кроме того, http://php.net/manual/en/control-structures.foreach.php рекомендует вам unset($source_array), прежде чем продолжить работу со своим сценарием (так как он скопирован, и у вас есть два массива в памяти)

только что нашел это :
Подробнее: Производительность FOR против FOREACH в PHP

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