用unset()加速PHP foreach循环?

时间:2013-12-13 05:50:28

标签: php arrays foreach unset associative

基于我所读到的关于php数组内部的内容,这可能是不可能的,但是我想过去看看你是否有机会......

我从SQL查询中提取了两个结果集。一个是客户数组(一组数组,实际上 - 每个客户都有ID和一些其他个人数据),第二个数组是客户订单数组(也是一组数组)。基本上,我的foreach循环将客户数组中的客户ID值与客户在第二个数组中所做的所有订单相匹配,并将它们推送到新的第三个数据结构中。

因此,假设我进行了SQL查询,并提取了500个客户和3,000个订单。平均来说,一个客户将有六个订单匹配。对于通过客户数组的每次迭代,我还需要遍历整个orders数组以获得所有匹配。然后我将这些推送到一个不同的数据结构,这最终将我将使用。

我想知道是否从两个原始数组中取消匹配的行会加速foreach循环,因为原则上每个循环的迭代次数较少。基于PHP如何为其数组使用哈希和存储桶,以及它如何在foreach循环中复制数组,我想知道性能是否会实际发生。我计划用一些虚拟数据测试这个,但我想知道这里是否有人遇到类似的情况。

谢谢!

编辑 - 感谢您的回答。是的,加入表可能是最好的方法,但我问这个问题是为了更好地理解PHP如何处理数组等。

我写了一个测试脚本,我现在可以看到使用unset()对我没有帮助:

$customers = Array('1' =>'Jim', '2' => 'Bill', '3' => 'John', '4' => 'Ed', '5' => 'Greg');
$orders = Array();
$final = Array();

for ($x = 0; $x < 1000000; $x++) {
    $orders[$x] = rand(1,5);
}

$start = microtime(true);
$counter = 0;
foreach ($customers as $key=>$customer) {
    $final[$customer] = Array();
    foreach ($orders as $key=>$order) {
        $counter++; 
        if ($order == $key) {
            $final[$customer][] = $order;
            unset($orders[$key]);               
        }
    }
}
echo $counter; // I usually get the same number of iterations whether unset() is used or not

$finish = microtime(true) - $start; // similar or worse performance if unset() is used

我看到的是unset()没有性能提升,而是减少了。最重要的是,unset()实际上并没有从数组中删除行。当我执行$ orders数组的count()时,它在结尾处与在开头时相同。

2 个答案:

答案 0 :(得分:0)

根据我的看法,您将分别获得客户的结果,并从数据库中单独订购数据。

客户

ID Name Add ..

1个......

2两......

3三....

订单

ID CID ord

1 1 ...

2 3 ....

3 3 ....

4 2 ....

检索数据本身时加入表并获取所需的结果,例如..

SELECT c.Name,c.ID,o.ord FROM customer c LEFT JOIN命令o ON c.ID = o.CID;

您可以根据要求添加条件;

答案 1 :(得分:0)

这只是我的头脑:

使用'arrayxyz []'语法将数据附加到另一个数组可能比'unset'更快,因为需要运行逻辑的开销以使'foreach'保持在有用的状态。

此外,取消设置数组项会删除键/值,如果使用数字索引,则会留下一个“洞”,这可能会影响“计数”功能,也可能不会影响“计数”。

您可能需要使用'array_values'来重新索引数组。