【发布时间】:2014-05-29 12:45:40
【问题描述】:
我有两个巨大的数组:
- 数组 A 有 4900 个项目(每个项目都是一个小数组)
- 数组 B 有 700 个项目(每个项目也是一个小数组)
所以基本上这些就是我的数组:
A = array (
[0] => array(
"name" => "KE-KE IMPEX ",
"email" => "someemai@gmail.com",
"kezbCompany" => "Fragrance",
"startDate" => "2013-03-25 00:00:00",
"endDate" => "2014-03-25 00:00:00",
"companyBase" => "06 20 232 2534"
)
...
[4900] => array(
"name" => "Jane Doe",
"email" => "zzer@sad.com",
"kezbCompany" => "sadsad",
"startDate" => "2013-03-25 00:00:00",
"endDate" => "2014-03-25 00:00:00",
"companyBase" => "06 20 232 2534"
)
)
B = array (
[0] => array(
"name" => "KE-KE IMPEX 46554 sda",
"email" => "xxx@gmail.com",
"kezbCompany" => "546wer",
"startDate" => "2013-03-25 00:00:00",
"endDate" => "2014-03-25 00:00:00",
"companyBase" => "06 20 232 2534"
)
...
[700] => array(
"name" => "45 Jane Doe",
"email" => "kekeimpex@gmail.com",
"kezbCompany" => "asd",
"startDate" => "2013-03-25 00:00:00"
)
)
例如,小物品看起来像这样(A和B的展位):
array(
'name' => 'John Doe',
'email' => 'john@doe.com'
)
所以我需要做的是:检查哪个小数组同名。
但请记住,大多数时候这两个小数组的结构不会相同。
因此,例如,他们的电子邮件可能不同。现在,如果我先遍历 A,然后再循环遍历 B,则需要很长时间。
这是我当前的代码:
$szData = file_get_contents('szData.txt');
$kData = file_get_contents('kData.txt');
$A = json_decode($szData);
$B = json_decode($kData);
$foundNr = 0;
foreach ($A as $key => $sz)
{
$cName = $sz->companyName;
foreach ($B as $index => $k)
{
$pattern = '/^(.*)+('.$cName.')/i';
echo "SzSor: " . $key . " --- Ksor: " . $index . "</br>";
if (preg_match($pattern, $k->companyName))
{
$founData[] = $k->companyName;
++$foundNr;
}
}
}
有什么想法吗?
【问题讨论】:
-
首先发布您当前的代码。
-
看看这里:phpdreams.com/blog-posts/best-practice-array-loops.html。这个人对遍历数组的不同方式和处理大型数组的最佳实践(在撰写本文时)进行了基准测试。希望这会有所帮助!
-
这是我们使用数据库管理系统的原因之一的一个很好的例子。
-
@DerikNel 这个链接是个糟糕的建议,他们已经触发 PHP 制作了一百万个数组副本,然后抱怨它很慢(您还会注意到它也会消耗大量内存,因为它同时持有所有这些数组,直到它可以在最后取消引用它们)。 PHP 有一个引用特性,用于在迭代数组时更新数组以避免这种情况。
foreach($array AS &$key){ $key++; },在我的测试中,这比他建议的任何替代方法快了近 20%。请参阅this answer 了解更多信息。 -
@scragar 同意,该链接主要是为了演示遍历数组的不同方法之间的速度差异。