【问题标题】:Group words in string with count using function使用函数对字符串中的单词进行计数
【发布时间】:2014-04-09 08:53:50
【问题描述】:

我需要一些帮助来获取字符串中数组的计数。

我有一个包含 5 个单词的数组:

$array_planet = array('[Sun]', '[Moon]', '[Mercury]', '[Venus]', '[Mars]');

我有很多看起来像这样的字符串:

$string_source = 'blabla[Sun][Sun]blabla[Moon][Moon][Moon]blabla[Sun][Sun][Sun][Sun]blabla[Venus]';

我需要一个函数来返回:

$string_out = 'blabla[Sun][2]blabla[Moon][3]blabla[Sun][4]blabla[Venus][1]';

blabla 可以是任意长度和值。

【问题讨论】:

  • 你试过array_count_values吗?
  • array_count_values 返回我 [Sun][6],但我需要 [Sun][2]blabla[Sun][4]
  • 考虑接受其中一个给出的答案。他们都很好,人们花时间帮助你,这应该很感激。它还可以防止这个问题得到更多不必要的关注。

标签: php function count grouping


【解决方案1】:

只需使用preg_replace_callback()

$string_source = preg_replace_callback('/(\[[^\[\]]+\])+/', function($matches)
{
   return $matches[1].'['.(strlen($matches[0])/strlen($matches[1])).']';
}, $string_source);

注意,我不依赖行星数组,因为 regex replace 不需要这样做。

小提琴可用here

【讨论】:

  • 这是完美的答案。 +1
【解决方案2】:

使用preg_replace_callback() 来实现:

$result = preg_replace_callback('/(\[.*?])+/', function($m) {
    return $m[1].'['.substr_count($m[0], $m[1]).']';
}, $string_source);

输出:

blabla[Sun][2]blabla[Moon][3]blabla[Sun][4]blabla[Venus][1]

Demo

【讨论】:

  • 不应该是[Sun][Sun]2,应该是[Sun][2]
  • 我没有看到演示中反映了这一点,但仍然显示相同。请再检查一次。 @AmalMurali
  • blabla 可以是任何长度和值
  • @AmalMurali,请在评论前仔细检查,您的演示仍然显示blabla[Sun][Sun][2] OP想要blabla[Sun][2]blabla[
  • 使用substr_count() 这不是一个好主意。它将产生O(n) 复杂性,而strlen() 始终是O(1)。示例比较测试代码是here - 我使用benchmarking tool 来测量时间使用情况。结果是here。很明显 - 字符串越长 - substr_count() 的结果越差
【解决方案3】:

我会使用preg_match_all 从你的字符串中获取部分,所以你最终会得到这样的东西:

array = (
 0= > 'blabla[Sun][Sun]',
 1 => 'blabla[Moon][Moon][Moon]',
 2 => 'blabla[Sun][Sun][Sun][Sun]',
 3 => 'blabla[Venus]'
);

然后遍历数组并使用str_replacesubstr_count

【讨论】:

  • blabla 可以是任意长度和值
  • 我知道。它仍然可以工作,但你必须在这里做一些思考自己:)
猜你喜欢
  • 2011-10-19
  • 2014-02-20
  • 2021-08-13
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多