【发布时间】:2015-10-14 02:13:40
【问题描述】:
我有一个应该包含 100,000 个项目的数组。 这是我的算法的样子:
$holder = array();
if($result->num_rows > 0)
{
while($row = $result->fetch_assoc())
{
for($i = 0; $i < mysqli_num_rows($result); $i++)
{
$x = 0;
if($holder[$i]['key'] == $row["key"] && $holder[$i]['value'] == $row["value"] )
{
$x++;
}
if($x == 0)
{
$holder[$row["key"]] = $row["value"];
}
}}
}
所以它的作用是从数据库中选择'key'和'value',检查'key'和'value'是否一起出现在这个数组中,如果它们一起出现,那么什么都不做,否则,添加这个'键'=> '值' 到数组。 问题是对于 100,000 行,完成这个过程需要很长时间,我需要一个更快的算法来在短时间内完成这项任务。 任何建议都将受到高度赞赏。
【问题讨论】:
-
您能否编辑您的问题以包括
$holder在操作前的样子、MySQL 结果集的样子以及$holder在操作后的样子?您将$holder[$i]['key'](整数键)和$holder[$row['key']](字符串键——或者key列是否也包含整数?)混合在一起似乎很奇怪,但也许我只是误解了您的目标。 -
也许您可以使用 fetch row 并自己进行基准测试?什么更快。或者你可以先在一个关联的本地数组中接收所有结果,然后让外部循环在这个数组上运行。
-
取决于您的查询,以及您想要的输出(这似乎只是按键和值的计数,无论如何您都可以通过您的查询来做到这一点
-
您知道哪些代码行执行时间最长吗?使用像 xdebug (xdebug.org) 这样的工具来找出哪些代码花费的时间最长。例如,您可能会发现数组操作不是瓶颈,而是对
mysqli_num_rows的重复调用需要很长时间。不分析代码,你不知道什么是慢的。 -
如果可以的话,消除将整个表加载到数组中的整个概念