Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用不同的字符串替换相同的字符_Php_Arrays_Replace - Fatal编程技术网

Php 用不同的字符串替换相同的字符

Php 用不同的字符串替换相同的字符,php,arrays,replace,Php,Arrays,Replace,假设我有一根绳子 $str = "abc*efg*hij*"; 和一个数组 $arr = array("123","456","789"); 现在我想根据位置将$str中的*替换为$arr中的元素。第一个*替换为$arr[0],第二个替换为$arr[1]等。我检查了函数,虽然它接受数组作为参数,但我发现它不起作用 $newstr = "abc{$arr[0]}efg{$arr[1]}hij{$arr[2]}" 因为真正的$str可能是一个包含大量*的很长的字符串。有什么好主意吗?谢谢。如果

假设我有一根绳子

$str = "abc*efg*hij*";
和一个数组

$arr = array("123","456","789");
现在我想根据位置将
$str
中的
*
替换为
$arr
中的元素。第一个
*
替换为
$arr[0]
,第二个替换为
$arr[1]
等。我检查了函数,虽然它接受数组作为参数,但我发现它不起作用

$newstr = "abc{$arr[0]}efg{$arr[1]}hij{$arr[2]}"

因为真正的
$str
可能是一个包含大量
*
的很长的字符串。有什么好主意吗?谢谢。

如果
*
是您唯一的格式字符,请尝试将
*
转换为
%s
(同时将现有的
%
转义为
%
),然后使用,它将值数组作为格式参数传入:

$str = str_replace(array('%', '*'), array('%%', '%s'), $str);
$newstr = vsprintf($str, $arr);
echo $newstr;
输出:

abc123efg456hij789

请注意,如果数组元素多于星号,则末尾的额外元素将不会出现在字符串中。如果星号多于数组元素,
vsprintf()
将发出太少的参数警告并返回
false

您可以始终使用
preg\u replace()
保持简单,并使用
$limit
参数,如下所示:

for($i = 0; $i < count($arr); $i++)
    $str = preg_replace('/\*/', $arr[$i], $str, 1);
($i=0;$i $str=preg\u replace('/\*/',$arr[$i],$str,1);

但出于实用性考虑,@BoltClock的答案是更好的选择,因为它a)不涉及循环,但更重要的是b)不必使用正则表达式。

很好的解决方案。我只是计划将其分解,然后合并各个部分,这显然不是一个好主意:)