$str = "helloworld";
我想创建字符串
$newStr = "h l o o l ";
所以你可以看到我想替换位置上的字符2,4,6,8,10 (假设第一个角色位于第1位)。
我可以做这样的事情
<?php
$str = 'helloworld';
$newStr = '';
for($i=0;$i<strlen($str);$i++) {
if($i%2==0) {
$newStr .= $str[$i];
} else {
$newStr .= ' ';
}
}
echo $newStr;
?>
但是有更简单的方法或构建函数中的一行可用于执行此任务。
提前致谢。
答案 0 :(得分:10)
使用正则表达式很容易完成:
echo preg_replace('/(.)./', '$1 ', $str);
点匹配一个角色。每隔一个字符用空格替换。
答案 1 :(得分:3)
首先你可以将你的计数器增加2,所以你不必检查它是否奇怪。
其次,因为字符串被视为char数组,您可以使用$str[$i]
访问$ i位置的字符。
$str = "Hello World";
$newStr = $str;
for($i = 1; $i < strlen($str); $i += 2) {
$newStr[$i] = ' ';
}
echo $newStr;
度过美好的一天。
[编辑]谢谢你提示提示。
答案 2 :(得分:2)
试试这个,比你的短一点但是你问的是单行。
$str = 'helloworld';
$newStr = '';
for( $i = 0; $i < strlen( $str ); $i++) { $newStr .= ( ( $i % 2 ) == 0 ? $str[ $i ] : ' ' ); }
echo $newStr;
答案 3 :(得分:1)
类似但使用生成器
$str = 'helloworld';
$newstr ='';
foreach(range($str, strlen($str)-1, 2) as $i){
$newstr.=$str[$i].' ';
}
答案 4 :(得分:0)
我认为正则表达式技术是最干净的,但为了对比,我将展示更多。
preg_replace()
提供最简洁,单一功能的呼叫解决方案。该模式使用\K
元字符来消除对捕获组的需要(捕获组会花费额外的“步骤”,因此在合理时应避免使用它们)。 \K
表示忘记所有先前匹配的字符,然后从字符串中的这一点重新开始“全字符串匹配”。换句话说,它使用奇数字符(根据OP的“奇数|偶数”定义),然后丢弃它们,然后匹配接下来出现的任何单字节字符。
在我的一组技术中,最费力的是,多功能方法将输入字符串拆分为最多包含2个字符的字符串数组,然后,如果子字符串具有第二个字符,则将其替换为空格在重新附加到重建的字符串之前。
for
循环可能是性能最佳的脚本,但不是立即可读的脚本类型(也就是说,有些人很难阅读正则表达式)。请注意,不要在每次迭代中调用strlen()
,这一点很重要。为避免这种情况,请在循环之前或循环的第一个参数中缓存长度。
代码:(Demo)
$str = "helloworld";
echo preg_replace('~.\K.~', ' ', $str);
echo "\n---\n";
echo array_reduce(str_split($str, 2), function($carry, $item) {
return $carry . $item[0] . (isset($item[1]) ? ' ' : '');
});
echo "\n---\n";
for ($offset = 1, $length = strlen($str); $offset < $length; $offset += 2) {
$str[$offset] = ' ';
}
echo $str;
输出:
h l o o l
---
h l o o l
---
h l o o l