4

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
4

3 に答える 3

3

なぜこれが必要なのかまだわかりません。ただし、配列に数値の順次配列としてインデックスを付けたので、次の「トリック」を実行してサイズを取得できます。

// Make sure the array pointer is at the end of the array
end($result); // Not sure if this is necessary based on your description
$size = key($result) + 1; // Get the numeric key of the last array element

end()両方に注意し、key()それらのパラメータを参照してください。しかし、彼らが現在参照の参照を操作していても驚かないでしょうが、これはあなたが調査できるものです。

于 2012-07-10T12:38:33.083 に答える
1

あなたが言及したが説明しなかった他のニーズに応じて、おそらくいくつかの本当に古い学校(深いレベル)の機能が助けになります:

end($result); // set pointer to (current) last element
$pos = key($result); //index of the last element
$row = &$result($pos);  

編集:入力が遅すぎます:)

于 2012-07-10T12:39:36.057 に答える
0

SPLデータ構造を確認する必要があります。おそらく、単純なSplHeapまたはSplDoublyLinkedListが要件に適合する可能性があります。また、パフォーマンスはかなり良いです!

于 2012-07-10T12:39:55.543 に答える