如何使用PHP从字符串中删除重复的单词?

5
以下是我拥有的变量:

$string = 'AAA,BBB,aAA,BbB,AAA,BbB';

我需要以下唯一字符串结果,
$string = 'AAA,BBB,aAA,BbB';

如何使字符串像array_unique()函数一样独特,是否有默认的字符串函数可在PHP中删除重复字符串?

由于某些原因,我像下面这样连接字符串,forloop(){ $string .= $a[i].',';} 最后得到的结果就是这样的。 - Thiyagu
即使使用这种类型的“数据”,该链接也会为您提供答案。 - Louis Loudog Trottier
1
你需要告诉 PHP 什么是“unique”,否则它无法理解你不是要删除所有逗号而是要找到唯一的字母模块,而不是单个字母。用 , 分割字符串为数组,使用 array_unique() 函数处理后再用 , 连接成字符串。 - Mark Baker
回顾这个旧页面,这个问题是Louis发布的关闭链接的完全副本。(它已经消失了,但我正在恢复它) - mickmackusa
2个回答

12

我不知道php是否有这样的函数,但你可以像这样处理它:现场演示

$raw = 'AAA,BBB,aAA,BbB,AAA,BbB';
$string = implode(',', array_unique(explode(',', $raw)));

2

声明一下,我完全支持Kris的做法,如果这是我的项目,我会选择这种方式。 但是,我想补充说还有其他几种方法可以解决这个问题:

代码: (演示)

$raw = 'AAA,BBB,aAA,BbB,BbB,AAA';

// str_word_count() -> array_unique() -> implode()
echo implode(',',array_unique(str_word_count($raw,1)));
echo "\n";

// str_getcsv() -> array_unique() -> implode()
echo implode(',',array_unique(str_getcsv($raw)));
echo "\n";

// preg_match_all() -> array_unique() -> join()
echo join(',',array_unique(preg_match_all("/[A-Za-z]{3}/",$raw,$m)?$m[0]:array()));
echo "\n";

// preg_split() -> array_unique() -> join()
echo join(',',array_unique(preg_split("/,/",$raw)));
echo "\n";

// preg_replace() -> parse_str() -> implode()
parse_str(preg_replace('/(^|,)([A-Za-z]{3})/',"$2=$2&",$raw),$array);
echo implode(',',$array);

我有5种不使用explode()函数来拆分csv字符串的方法。
第一种方法不使用array_unique函数。
当然,implode()join()可以互换使用,因为它们是同义词。
我认为第五种方法是我最喜欢的,因为它最疯狂,而且不使用array_unique()函数。*不幸的是,这是一个两行代码的方法:{。
附注:
@Thiyagu说这就是字符串的构造方式:
forloop(){ $string .= $a[i].',';}

如果这是真的,那么可以通过利用临时数组在此循环内进行重复项筛选。这样做的额外好处是省略了连接生成的尾逗号。

foreach($data as $value){
    $result[$value]=$value;  // duplicate values will be overwritten because arrays may not have two identical keys
}
echo implode(',',$result);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接