PHP:如何用另一个数组中的一个替换数组中的每个字符

时间:2019-01-02 05:06:02

标签: php

我想用另一个数组替换一个数组中的每个字符:

<?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'与其他人发生冲突

3 个答案:

答案 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);

https://3v4l.org/vugQT

答案 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);

https://3v4l.org/tcrHK