2

preg_replace周末我做了一些工作,当我看到一些奇怪的东西时,我正在阅读PHPpreg_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

数组索引就是这样,索引,它们不指示值在内存中的存储位置,我想象 preg_replace 在传递数组时使用的 next() 和 current() 之类的函数,从起始内存地址迭代数组到最后为了效率。

与 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 回答