【问题标题】:How to get a unique comma separated string from a non-unique string in php如何从php中的非唯一字符串中获取唯一的逗号分隔字符串
【发布时间】:2011-02-25 05:27:10
【问题描述】:

我有一个php字符串

$select_columms = 'pid, p.title, caption, filepath, filename, encaption, user1, user2, user3, user4, user5, user6, ult_puja, p.title, user2, user3';

所以我有了这个想法,我可以用这行代码得到一个唯一的字符串

$select_columns = implode(',', array_unique(array_filter(explode(',',$select_columns))));

但它似乎不起作用你能看到我错过了什么吗?

编辑: 感谢帮助我的最终代码是:

$select_columns = implode(',', array_filter(array_unique(explode(',', $select_columns))));

输出$select_columns = 'pid, p.title, caption, filepath, filename, encaption, user1, user2, user3, user4, user5, user6, ult_puja'

如果我有像', pid,'这样的输入,我会使用array_filter

【问题讨论】:

  • 所以您的意思是要删除出现在逗号分隔字符串中的重复值,并将输出保留为逗号分隔字符串?
  • 正是@Neddy 创建选择语句的逻辑导致查询重复字段
  • 谁能告诉我为什么函数的顺序会有所不同?
  • @amitchd 在我的解决方案的 cmets 中指出,如果列之间有空格,您的代码将无法工作。 'pid , pid , pid' 将返回 pid 两次。我修改了我的解决方案以考虑到这一点

标签: php mysql arrays unique


【解决方案1】:

试试这个

echo implode(',', array_unique(explode(',', $select_columms)));

编辑正如@amitchd 指出的那样。不修剪时很难失败。现已修复

如果你的字符串间距不均匀,你可以这样做

$select_columms = 'pid, p.title, caption, filepath, filename, encaption, user1, user2, user3, user4, user5, user6, ult_puja, p.title, user2, user3';
$arr    = explode(',', $select_columms);
array_walk($arr, '_trim');
echo implode(',', array_unique($arr));

function _trim(&$value) {
    $value = trim($value);   
}

【讨论】:

  • 在运行 array_unique 函数之前,可能想要对爆炸的结果使用 trim 函数进行 array_walk :)。
  • @amitchd,我想到了这一点,但后来我发现空格无论如何都会变得独一无二,并且在向链中添加另一个函数时不会影响输出
  • @JohnP, $select_columms = 'pid, pid, pid';你会有两个 pid。
  • @amitchd 抱歉!嗯,这很尴尬。忘记了,是delim。我发布了一个修复程序。谢谢指出
  • 如何处理 $select_columms = ', ,pid, p.title, caption, filepath, filename, encaption, user1, user2, user3, user4, user5, user6, ult_puja, p.title, user2 , 用户 3';这就是我使用数组过滤器的原因,也是原始代码的原因
【解决方案2】:

对我来说似乎很好。 2个问题:

1) 你在变量声明中拼写错误“columns”

2) array_filter() 在这里是多余的 - 没有它它的工作原理完全相同。

演示:

$ php -a
Interactive shell

php > $select_columns = 'pid, p.title, caption, filepath, filename, encaption, user1, user2, user3, user4, user5, user6, ult_puja, p.title, user2, user3';

php > echo  implode(',', array_unique(explode(',',$select_columns)));
pid, p.title, caption, filepath, filename, encaption, user1, user2, user3, user4, user5, user6, ult_puja

php > 

【讨论】:

  • 谢谢,但有时输入可能是 pid、p.title、标题、文件路径、文件,所以我也需要删除空白实体
  • 当我发现是 array_filter 的顺序对我的代码产生了影响时,我不接受答案
  • @Traveling_Monk:很公平。为了将来参考,如果您比“它似乎不起作用”更明确,则可以避免大多数混淆:)
【解决方案3】:

JohnP 的回答应该有效。作为个人喜好,我至少将其分为两行。一行中的三个函数可能很难阅读...

【讨论】:

    【解决方案4】:

    列拼写错误,array_filter 是不必要的,并且爆炸/内爆在逗号后缺少一个空格。

    <?php
    $select_columns = 'pid, p.title, caption, filepath, filename, encaption, user1, user2, user3, user4, user5, user6, ult_puja, p.title, user2, user3';
    
    $select_columns = implode(', ',array_unique(explode(', ',$select_columns)));
    
    var_dump($select_columns);
    ?>
    

    http://ideone.com/clone/b6dZd

    【讨论】:

    • 这些列实际上是在应用程序中正确拼写的,我不相信 implode 或 explode 中的间距会产生差异......
    • @Traveling_Monk 是的,没错。
    【解决方案5】:
    $str = implode(',',array_unique(explode(',', $str)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-12
      • 2021-12-27
      • 2021-05-10
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      相关资源
      最近更新 更多