我需要用一个字符数组替换主题上所有出现的#
。例如:
Input: "#### #### #### ####"
Search character: "#"
Replacement array: [ 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3 ]
Expected result: "0000 1111 222 3333"
我试图使用:
str_replace("#", $array, $subject)
但它并不像我想要的那样有用。有什么想法吗?
答案 0 :(得分:2)
您可以使用preg_replace_callback()
并访问替换数组,并用新元素替换每个匹配项,例如
<?php
$input = "#### #### #### ####";
$replacement = [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3];
$key = 0;
$output = preg_replace_callback("/#/", function($m)use(&$key, $replacement){
if(isset($replacement[$key]))
return $replacement[$key++];
else
return $replacement[$key = 1];
}, $input);
echo $output;
?>
输出:
0000 1111 2222 3333
答案 1 :(得分:1)
为什么一个简单的for循环可以做到这一点?
function replacer($array,$item, $subject){
foreach($array as $character)
$subject=preg_replace('/'.$item.'/',$character,$subject,strlen($item));
return $subject;
}
测试
$input = "#### #### #### ####";
$replacement = [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3];
echo replacer($replacement, '#',$input);
输出
0000 1111 2222 3333
答案 2 :(得分:0)
我用一个简单的for
来解决它。
$subject = "#### #### #### ####";
$numbers = "0000111122223333"; // I could use array, instead
$numbersLength = strlen($numbers);
for ($i = 0; $i < $numbersLength; $i++) {
$subject = preg_replace("/#/", $numbers[$i], $subject, 1);
}
我认为这不是一个优雅的解决方案,但似乎PHP没有本地方法来实现它。