将唯一字符替换为数组

时间:2015-07-26 17:45:43

标签: php arrays string replace

我需要用一个字符数组替换主题上所有出现的#。例如:

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)

但它并不像我想要的那样有用。有什么想法吗?

3 个答案:

答案 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没有本地方法来实现它。