2

preg_replace私は週末に少し作業をしていて、何か変なものを見つけたときにPHPのpreg_replaceドキュメントを読んでいました。

ドキュメントの例 #2 は、次の php コードが与えられた場合を示しています

<?php
$string = 'The quick brown fox jumped over the lazy dog.';
$patterns[0] = '/quick/';
$patterns[1] = '/brown/';
$patterns[2] = '/fox/';
$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';
echo preg_replace($patterns, $replacements, $string);
?>

出力は次のようになります

"The bear black slow jumped over the lazy dog."

そして、(私の意見では) デフォルトで出力されるべきものを生成するには、ksort()事前に呼び出す必要があります。このような:

<?php
ksort($patterns);
ksort($replacements);
echo preg_replace($patterns, $replacements, $string);
?>

これは本当に php のバグの回避策ではないpreg_replace()でしょうか? なぜphpはこのように動作するのですか? ここで宣言されている配列には、私が欠けている特異性がありますか?

4

4 に答える 4

4

ドキュメントも言う:

キーは配列に表示される順序で処理されます

したがって、これが発生する理由は、単純なforeachタイプの反復が使用され、インデックス アクセスではないためです。

于 2009-12-21T14:43:42.380 に答える
2

残念ながら、PHP のすべての配列は連想配列です。

$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';

2 -> くま、1 -> 黒、0 -> 遅いとして保存されます

の典型的なブロックの代わりに

遅い | 黒 | くま

于 2009-12-21T14:49:16.063 に答える
1

配列インデックスは単なるインデックスであり、メモリ内のどこに値が格納されているかを指示しません. next() や current() などの関数は、配列を渡したときに preg_replace が使用すると想像します.開始メモリアドレスから効率のために最後に。

PHP の多くの場合と同様に、この配列の反復処理は高速化のために構築されています。それ以外は開発者次第です。そのため、もう少し作業を行うためにさらに数行を追加する必要があります。

于 2009-12-21T14:49:30.603 に答える
0

preg_replace()このようなコードを実行している場合のように動作します

reset($patterns);
reset($replacements);

$pattern = current($patterns);
$replacement = current($replacements);

do {
  // Replace the pattern, if found.
  $pattern = next($patterns);
  $replacement = next($replacements);
} while ($pattern !== FALSE);

を呼び出さなくても関数が機能することをお勧めしますksort()

于 2009-12-21T14:48:45.933 に答える