使用unset()加速PHP foreach循环


Speeding up PHP foreach loop with unset()?

根据我所读到的关于php数组内部的内容,这可能是不可能的,但我想让您了解一下,看看是否有机会。。。

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

假设我进行SQL查询,得到一个由500个客户和3000个订单组成的数组。平均而言,一个客户将有六个订单需要匹配。对于客户数组的每次迭代,我还需要迭代整个订单数组以获得所有匹配项。然后,我将把这些推到一个不同的数据结构中,这就是我最终要使用的。

我想知道从两个原始数组中取消设置匹配的行是否会加快foreach循环,因为原则上每个循环迭代的次数会更少。基于PHP如何为数组使用散列和bucket,以及它在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()时,它在末尾和开头是一样的。

根据我的理解,您将分别从DB中获得客户的结果和订单数据。

客户

ID 名称 添加

1 一 。。

2 两个 。。

3 三 。。。

订单

ID CID ord

1 1 。。

2 3 。。。

3 3 。。。

4 2 。。。

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

从客户c中选择c.姓名、c.ID、o.ord在c.ID=o.CID上左联接订单o;

您可以根据需要添加where条件;

这简直是我的头顶:

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

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

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