1

よくわからないので、私の質問は少し漠然としているかもしれません。

私は、mysql クエリの結果を配列「ツリー」に変換しようとする PHP の一部を持っています。つまり、定義されたグループに応じた配列の配列です。

このコードは、グループ化を示すために列名が 2 つのアンダースコア __ で始まることを想定しており、結果はグループ化によって既に並べ替えられています。

コードは機能しますが、場合によっては速度が低下して使用できなくなります。高速であると期待されるケース。一意の値が少なく、各ブランチに多数の項目がある 1 つのグループ化だけで、最大 30 秒かかる場合があります。ブランチのレイヤーが多く、値が異なる他のケースでは、1 秒しかかかりません。(結果セットは通常、約 20,000 行です)

だから、私が推測する私の質問は、単純に、私のコードの何が問題なのですか? パフォーマンスに大きな影響を与えるほどひどく混乱している場所。

PS私は相対的なPHP初心者なので、優しくしてください:)

申し訳ありませんが、コード コメントはありません 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":"なし","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 |
 +----------+-----+-----+
4

1 に答える 1

0

count($branch) へのすべての呼び出しが判明しました。どうやら count のように参照による変数を期待しない関数を呼び出し、参照による変数を使用すると、関数は操作対象の変数のコピーを作成します。

私の場合、何千もの要素を持つ配列です。これは、少数の (しかし大きなブランチ) を使用した結果が最も影響を受ける理由も説明しています。

このスレッドを参照してください: 参照 された値に対する関数 (strlen、count など) の呼び出しが非常に遅いのはなぜですか?

于 2012-07-10T12:11:48.573 に答える