簡體   English   中英

PHP:如何用另一個數組中的一個替換數組中的每個字符

[英]PHP: How replace a each character from an array with one in the another array

我想用另一個數組替換一個數組中的每個字符:

<?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'與其他人發生沖突

也許嘗試用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

當將str_replace與arrays()用作$ search和$ replace參數時,該函數將針對$ subject字符串的每個字符評估$ search數組中的每個項目。 了解這一點很重要,因為給定字符的每個“循環”都會評估該點在該對象上正在處理的$ subject位置的內容。

這樣一來,該函數就可以一次更改該字符多次(針對$ search數組中的所有項目,該字符來自$ subject)。

一個簡單的示例將是以下代碼/輸出:

$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的新狀態),然后跟隨“循環”,在$ search數組,並替換為“ 6u”。 那時,您擁有“ 6a 66u”。 您可以推斷其余部分。

第一個“ a” =>“ 6a”之所以准確的原因是,搜索“循環”的第一次迭代后的$ str的新狀態(即“ 6a”)將與匹配項中的其他任何項都不匹配。搜索數組。

根據php文檔( php.net str_replace() ):

注意:更換訂單須知。 由於str_replace()從左到右替換,因此在進行多次替換時可能會替換先前插入的值。

此行為導致非常有趣/意外的結果,並且調試起來並不容易。

一些答案已經指向解決方案,我想介紹一下有關php的經驗行為的詳細信息。

希望對您有所幫助,讓我知道! 干杯

您需要更加精確。 您可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM