よくわからないので、私の質問は少し漠然としているかもしれません。
私は、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 |
+----------+-----+-----+