mysqlの結果から数千行をループして、それらを別の配列に追加しています。
配列内の操作する最後の要素への参照を取得します(この質問の範囲外の理由で)。
つまり(シナリオのほんの一例)
$myarray = array();
$result = &$myarray;
$row = &$result[count($result)-1]
もちろんこれは機能しますが、このスレッド(参照値で関数(strlen、countなど)を呼び出すのが非常に遅いのはなぜですか?)が説明しているように、参照によって変数を期待しない関数を呼び出すと、参照によって変数を使用して、関数に、操作する変数のコピーを作成させます。
$ result配列が数千の要素に成長すると、継続的にcountを呼び出し、そのコピーが作成されるため、コードが使用できなくなります。
どうすればこれを回避できますか-参照によって変数を使用しないことを提案せずに。また、個別の行カウンターを保持することはできません。
基本的に、参照変数を逆参照する方法(これは実行できないことを理解しています)、または配列の長さを取得する他の方法を知る必要がありますか?、または配列の最後の行への参照を取得する方法(ポップせずに)
配列が空になる可能性があることを念頭に置いてください。
これが問題であることに気付くのに何年もかかりましたので、問題の解決にご協力いただければ幸いです。
編集 カウントがエンド/キーより遅くなることはないだろうと言うすべての人に:この簡単なテストを実行して確認するだけです
//setup array of 10 000 elements
$ar = array();
for ($i = 0 ; $i < 10000 ; $i++)
{
$ar[] = $i;
}
//get a reference to it
$ref = &$ar;
error_log (date("Y/m/d H:i:s")." : speed test 1 \r\n",3,"debug.log");
//do 10 000 counts on the referenced array
for ($i = 0 ; $i < 10000 ; $i++)
{
$size = count($ref);
}
error_log (date("Y/m/d H:i:s")." : speed test 2 \r\n",3,"debug.log");
//do 10 000 end/key on the referenced array
for ($i = 0 ; $i < 10000 ; $i++)
{
reset($ref);
end($ref);
$size = key($ref);
}
error_log (date("Y/m/d H:i:s")." : end \r\n",3,"debug.log");
出力:カウントを実行するのに15秒...終了/キーを実行するのに1秒未満
2012/07/10 17:25:38 : speed test 1
2012/07/10 17:25:53 : speed test 2
2012/07/10 17:25:53 : end