如何在 str_replace() 的搜索参数中获取数组中的数值以按预期方式映射


How do I get numeric values in an array in str_replace()’s search parameter to map the way I expect?

php > echo str_replace(
    array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'),
    array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p'),
    '01234567890abcdef') . PHP_EOL;
klmnopghijkklmnop

我以为这个str_replace()电话能给我带来类似abcdefghijklmnop.但似乎我的搜索数组中的数字字符串被视为字符串以外的其他内容。

我最终只是追求tr(1)的功能(例如,tr a-f k-p | tr 0-9 a-j),但当然是使用纯 php 而不是 shellout。

我在 php-5.4.10--pl0-gentoo 和 php-5.5.4-pl0-gentoo 上看到了同样的行为,所以我认为这不仅仅是一个版本的 PHP 的侥幸。为什么 str_replace() 奇怪地处理搜索数组中的数字——无论如何它是如何处理它们的?

你可以在 PHP 中使用 use strtr 函数:

echo strtr( '01234567890abcdef', '0123456789abcdef', 'abcdefghijklmnop' ) . PHP_EOL;
// abcdefghijaklmnop

来自手册

由于 str_replace() 从左到右替换,因此在执行多次替换时,它可能会替换以前插入的值。另请参阅本文档中的示例。

它只是替换已经替换的值,这就是为什么你会得到"奇怪的结果"

例:

第一个结果字母是K而不是A这是因为0被替换为A然后A被替换为K。当你这样想时,你会看到这个函数的正确结果。

按顺序应用替换,并针对每个替换选项从头到尾扫描整个字符串。

在第一次替换运行中,0被替换为a,然后在第 10 次替换运行中,a被替换为k是正常的。

您要实现的是不对已经替换的字符串执行替换。我认为这将被认为是不直观/意外的行为。

告诉我们您希望将其应用于哪些实际用例,以便我们为您提供更实用和直接的解决方案;为正确的工作提供正确的工具。

我认为您要查找的是strtr - http://www.php.net/manual/en/function.strtr.php