我正在尝试编写一个将符号#添加到字符串中的单词数组的函数
鉴于我可以对每个参数使用str_replace,但是我的数组越来越大,效率不高。
$needles = array('a', 'c', 'd');
$haystack = 'a b c d e f g';
foreach($needles as $what) {
if(strpos($haystack, $what)!==false) {
$haystack = str_replace($needles, '#'.$what.'-', $haystack);
}
}
echo $haystack;
这里的数组是 a b c d e f g 的大海捞针 a c d 我正在尝试使它们成为#a #b #c,以使结果为 #a b #c #d e f g
答案 0 :(得分:1)
您在此str_replace()函数中使用的错误 在str_replace function
上了解有关此功能的更多信息$needles = array('a', 'c', 'd');
$haystack = 'a b c d e f g';
foreach($needles as $key) {
if(strpos($haystack, $key)!==false) {
$haystack = str_replace($key, '#'.$key, $haystack);
}
}
echo $haystack;
输出
#a b #c #d e f g
希望这对您有帮助
答案 1 :(得分:0)
我不确定是否可以更快地进行基准测试,但是此解决方案有效。正则表达式很慢,但是遍历一个字符串比遍历N次要快。
<?php
$needles = array('a', 'c', 'd');
$haystack = 'a b c d e f g';
$reg = '~(['.implode($needles).'])~';
echo preg_replace ( $reg, '#$1' , $haystack );
输出
#a b #c #d e f g
答案 2 :(得分:0)
如何对其进行优化:
就这样:
代码:
<?php
$needles = array('a', 'c', 'd');
$haystack = 'a b c d e f g';
function convert($needles, $haystack) {
if(is_resource($haystack)) {
$stream = $haystack;
} else {
$stream = fopen('data://text/plain,' . $haystack,'r');
}
while($char = fgetc($stream)) {
if(in_array($char, $needles)) {
$result = '#' . $char;
} else {
$result = $char;
}
yield $result;
}
if(is_resource($stream)) {
fclose($stream);
}
}
# use with haystack as string
$converted = convert($needles, $haystack);
# or use when haystack is in file
// $filePath = 'test-file.txt';
// $fileResource = fopen($filePath, 'r');
// $converted = convert($needles, $fileResource);
//echo converted string char by char
foreach($converted as $convertedChar) {
echo $convertedChar;
}
给予:
#a b #c #d e f g
使用方法:
将function convert() {}
定义放在您喜欢的位置,然后再使用它:
$needles = array('a', 'c', 'd');
$haystack = 'a b c d e f g';
$converted = convert($needles, $haystack);
$converted
现在是一种数组,它的每个元素都是要转换的字符串的一个字符。因此,要使所有字符都回显,您可以将其视为数组
['#a', 'b', '#c', '#d', 'e', 'f', 'g']
并在foreach循环中回显:
//echo converted string char by char
foreach($converted as $convertedChar) {
echo $convertedChar;
}
令人高兴的是,从未创建“数组类型”,它看起来和感觉都像是foreach
的数组,但实际上,它每次迭代仅返回一个修改的字符。因此,convert()的内存消耗几乎为零。
第二种方法(广告3)是从文件中读取整个干草堆并即时对其进行处理。这种方法甚至可以处理非常大的干草堆,因为它不会立即将其读取到内存中并在处理之前将其完整存储,而是从输入中读取一个字符,然后将其更改并回显,然后再处理另一个。
评论此代码块:
//$converted = convert($needles, $haystack);
并取消注释:
# or use when haystack is in file
$filePath = 'test-file.txt';
$fileResource = fopen($filePath, 'r');
$converted = convert($needles, $fileResource);
然后使用foreach像以前一样回声
//echo converted string char by char
foreach($converted as $convertedChar) {
echo $convertedChar;
}
如果要将转换后的文本存储为字符串,可以这样:
$convertedStr = '';
foreach($converted as $convertedChar) {
$convertedStr .= $convertedChar;
}
//and echo or save later
echo $convertedStr;