【问题标题】:Slow php array processingphp数组处理慢
【发布时间】:2012-07-08 19:52:33
【问题描述】:

我的问题可能有点模糊,因为我不太清楚。

我有一段 PHP 尝试将 mysql 查询结果转换为数组“树”。 IE。数组的数组取决于定义的组。

代码假定列名以双下划线 __ 开头以指示分组,并且结果已按分组排序。

代码有效,但在某些情况下,它会减慢到无法使用的速度。 我希望它很快的案例。每个分支中只有一个只有几个唯一值和许多项目的分组有时需要长达 30 秒。 其他有很多层分支和很多不同值的情况,只需要1秒。 (结果集通常在 20 000 行左右)

所以,我想我的问题很简单,我的代码有什么问题?哪里搞砸了,会严重影响性能。

附:我是一个相对的php新手,所以要温柔:)

对不起,没有代码 cmets O_o

$encodable = array();
$rownum = 0;
$branch = null;
$row = null;
$first = true;
$NULL = null;
$result = mysql_query($value,$mysql);
error_log (date("F j, Y, g:i a")."\r\n",3,"debug.log");
if (gettype($result) == "resource")
{

    while($obj = mysql_fetch_object($result))
    {
        $newrow = true;
        $branch = &$encodable;
        $row = &$NULL;
        if (count($branch) > 0)
        {
            $row = &$branch[count($branch)-1];
        }

        foreach ($obj as $column => $value)
        {
            if ($column[0] == '_' && $column[1] == '_')
            {

                $gname = substr($column,2);
                if (isset($row[$gname]) && $row[$gname] == $value)
                {

                    $branch = &$row["b"];
                    $row = &$NULL;
                    if (count($branch) > 0)
                    {
                        $row = &$branch[count($branch)-1];
                    }
                }
                else
                {
                    $branch[] = array();
                    $row = &$branch[count($branch)-1];

                    $row[$gname] = $value;
                    $row["b"] = array();
                    $branch = &$row["b"];
                    $row = &$NULL;
                    if (count($branch) > 0)
                    {
                        $row = &$branch[count($branch)-1];
                    }
                }
            }
            else
            {

                if ($newrow)
                {
                    $branch[] = array();
                    $row = &$branch[count($branch)-1];
                    $newrow = false;
                }
                $row[$column] = $value;
            }
        }

        $rownum++;
    }
}
$encoded = json_encode($encodable);

编辑: 示例输出 - 结果数组转换为 json。 这个小集合按“av”分组,b 由每个分支的代码创建,然后包含每个 AV 的 [hid, utd] 记录列表。

[{"av":"eset nod","b":[{"hid":"3","utd":"1"}]},{"av":"None","b ":[{"hid":"2","utd":"0"},{"hid":"4","utd":"0"},{"hid":"5","utd ":"0"},{"hid":"1","utd":"0"}]}]

产生这个结果的实际sql结果是:

 +----------+-----+-----+
 | __av     | hid | utd |
 +----------+-----+-----+
 | eset nod |   3 |   1 |
 | None     |   2 |   0 |
 | None     |   4 |   0 |
 | None     |   5 |   0 |
 | None     |   1 |   0 |
 +----------+-----+-----+

【问题讨论】:

  • 两句:你为什么到处使用引用(&)?如果您向我们提供查询的一小部分实际结果,那将真的很有帮助。否则很难理解你在做什么。
  • 另外尝试使用 xdebug 分析您的代码,并让我们知道您看到了什么。
  • 我添加了示例输入/输出。我现在不在现场,所以我无权访问(完整)数据。当我再次在现场时,我会尝试让 xdebug 运行。虽然我以前从未使用过它。来自 c++ 背景,对我来说将引用用作“行指针”作为遍历行和列的循环是有意义的。因此,插入总是可以针对 $row 变量发生,这与我在哪个数组或子数组中无关。否则我不知道该怎么做。

标签: php arrays


【解决方案1】:

结果是所有对 count($branch) 的调用。 显然调用一个函数,它不期望像 count 这样的引用变量,使用引用变量,会导致函数复制要操作的变量。

在我的例子中,数组包含数千个元素。这也解释了为什么它的结果很少(但分支很大)是受害最大的。

看到这个帖子: Why is calling a function (such as strlen, count etc) on a referenced value so slow?

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    相关资源
    最近更新 更多