我想用另一个数组替换一个数组中的每个字符:
<?php
$str="a b c d e f g h i j ";
$pattern=array();
$pattern[0]="a";
$pattern[1]="b";
$pattern[2]="c";
$pattern[3]="d";
$pattern[4]="e";
$pattern[5]="f";
$pattern[6]="g";
$pattern[7]="h";
$pattern[8]="i";
$pattern[9]="j";
$replacement=array();
$replacement[0]="6a";
$replacement[1]="6e";
$replacement[2]="6i";
$replacement[3]="6o";
$replacement[4]="6u";
$replacement[5]="5a";
$replacement[6]="5e";
$replacement[7]="5i";
$replacement[8]="5o";
$replacement[9]="5u";
echo str_replace($pattern,$replacement,$str);?>
结果:
6a 66u 65o 6o 6u 5a 5e 55o 5o 5u
a b c d e f g h i j
'b' 'c' 'h'
与其他人发生冲突
答案 0 :(得分:2)
也许尝试用strtr
替换每个字符:
$str = "a b c d e f g h i j ";
$replacements = [
"a" => "6a",
"b" => "6e",
"c" => "6i",
"d" => "6o",
"e" => "6u",
"f" => "5a",
"g" => "5e",
"h" => "5i",
"i" => "5o",
"j" => "5u",
];
echo strtr($str, $replacements);
答案 1 :(得分:1)
在将str_replace与arrays()一起用作$ search和$ replace参数时,该函数将针对$ subject字符串的每个字符评估$ search数组中的每个项目。了解这一点很重要,因为给定字符的每个“循环”都会评估该点在该点上正在处理的$ subject位置的内容。
这导致该函数能够一次更改多次该字符($ subject中的该字符,与$ search数组中的所有项目相对应)。
一个简单的示例是以下代码/输出:
$str = "a b c";
$pattern = array("a","b","a");
$replacement = array("a1","b1","c1");
echo str_replace($pattern, $replacement, $str); // Output : c11 b1 c
该函数针对$ str中的每个字符对搜索数组中的所有项目执行“搜索”。这是$ str(“ a”)中第一个字符的第一个“循环”:
首先找到“ a”,将其替换为“ a1”,然后查找“ b”,但未找到。然后,它再次寻找“ a”,并用导致“ c11”的映射“ a” =>“ c1”替换上述替换(“ a” =>“ a1”)。
然后转到$ str中的下一个字符。
您的示例
针对$ str(“ b”)中的第二个字符进行搜索时,将其替换为“ 6e”(这是$ str的新状态),然后在“循环”之后输入NEW“ e”在$ search数组中找到,并替换为“ 6u”。那时,您拥有“ 6a 66u”。您可以推断其余部分。
第一个“ a” =>“ 6a”正确的原因是,搜索“循环”的第一次迭代后的$ str的新状态(即“ 6a”)不会与其他任何匹配搜索数组中的项目。
根据php文档(php.net str_replace()):
注意: 更换订单陷阱。 由于str_replace()从左到右替换,因此在进行多次替换时可能会替换以前插入的值。
这种行为导致了非常有趣/意外的结果,并且调试起来并不容易。
一些答案已经指向解决方案,我想了解一下有关php的经验行为的详细信息。
希望这会有所帮助,让我知道!干杯
答案 2 :(得分:0)
您需要更加准确。您可以使用preg_replace
。此处的正则表达式使用单词边界https://www.regular-expressions.info/wordboundaries.html。
$str="a b c d e f g h i j ";
$pattern=array();
$pattern[0]="/\ba\b/";
$pattern[1]="/\bb\b/";
$pattern[2]="/\bc\b/";
$pattern[3]="/\bd\b/";
$pattern[4]="/\be\b/";
$pattern[5]="/\bf\b/";
$pattern[6]="/\bg\b/";
$pattern[7]="/\bh\b/";
$pattern[8]="/\bi\b/";
$pattern[9]="/\bj\b/";
$replacement=array();
$replacement[0]="6a";
$replacement[1]="6e";
$replacement[2]="6i";
$replacement[3]="6o";
$replacement[4]="6u";
$replacement[5]="5a";
$replacement[6]="5e";
$replacement[7]="5i";
$replacement[8]="5o";
$replacement[9]="5u";
echo preg_replace($pattern,$replacement,$str);