【问题标题】:How to decrease the time of adding values to an array?如何减少向数组添加值的时间?
【发布时间】: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 的重复调用需要很长时间。不分析代码,你不知道什么是慢的。
  • 如果可以的话,消除将整个表加载到数组中的整个概念

标签: php sql arrays algorithm


【解决方案1】:

您发布的原始代码似乎有问题.. 但我会发布您描述的算法

$holder = array();                                 //the array to be filled
if($result->num_rows > 0)                          //if database returned results 
    while($row = $result->fetch_assoc())           //for each returned result
        if(!isset($holder[$row["key"]]))           //if result not already in array
            $holder[$row["key"]] = $row["value"];  //set it

这应该是你能得到的最快速度,只需优化代码.. 更快需要其他方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2022-12-09
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多