在PHP中foreach生成一个数组并返回它将导致CPU利用率增加

时间:2012-03-02 06:51:08

标签: php performance foreach

我有一个源数组,在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;
}

调用此函数将导致CPU利用率大幅增加。 如果我将foreach更改为for循环

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

CPU利用率将下降...... 我不确定这两者之间有什么区别? 如果我只打印新阵列而不返回它,CPU也不会变高。 有人有一些线索吗? THX。

1 个答案:

答案 0 :(得分:4)

每个foreach迭代都会返回您在数组中拥有的实际数据的副本,如果它是一个大数组和/或多维,您正在对复制的数据进行操作,然后返回$newInfo,那就是为什么CPU在这种情况下不同意你的意思。

另一方面,

for循环只是循环,直到你告诉它停止(例如,直到$i < $cnt),它并不关心你在哪里做什么改变,它肯定没有不要把任何东西复制到任何地方。它只是循环。

另外,http://php.net/manual/en/control-structures.foreach.php建议您在继续编写脚本之前unset($source_array)(因为它已被复制,现在内存中有两个数组)

刚发现这个
阅读更多:Performance of FOR vs FOREACH in PHP