一个PHP函数,将#标签添加到单词数组中

时间:2019-06-01 03:22:49

标签: php function foreach hashtag

我正在尝试编写一个将符号#添加到字符串中的单词数组的函数

鉴于我可以对每个参数使用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

3 个答案:

答案 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)

如何对其进行优化:

  1. 每针需要执行的限量指令
  2. 使用更快的此类指令
  3. 更改执行路径方法,以便整个应用程序更有效地使用解决方案

就这样:

  1. strpos($ haystack,$ what)-可以删除此功能
  2. str_replace()可以替换为应该更快的in_array()。
  3. 在您的示例代码中str_replace()需要搜索一个字母来更改整个$ haystack长度乘以针数,因此,如果haystack的长度为10个字符,并且您有5针,这意味着str_replace确实可以搜索总共500个字符(在100个字符的字符串中搜索5次)。如果没有5针但有10针,并且干草堆为1000个字符,则长度将跳到总共10k长度,以供str_replace处理。这就是为什么当您增加针数或干草堆长度时,执行速度会急剧下降的原因。理想情况下,应针对整个干草堆长度进行一次搜索,因此,如果有5根针且干草堆为100个字符,则搜索应仅进行一次,并且搜索的总字符数为100个字符。 另外:对于存储在文件中的长字符串,您可以完全跳过流,只需使用流,直接从文件中逐个读取它们,并即时替换它们即可。

代码:

<?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;