在PHP中删除逗号分隔列表中的重复值

时间:2013-02-23 19:30:14

标签: php string duplicates concatenation

如何删除PHP中逗号分隔列表中的重复值?

我有两个版本的客户问卷 - 一个比另一个更详细 - 一个是他们被问到他们喜欢的项目,另一个被要求他们按排名顺序指定他们喜欢的项目。在此特定示例中,其中一列('items_like')可能在逗号分隔列表中包含多个值。还有另外两种情况,其中每个列可能在逗号分隔列表中包含多个值。

为了显示客户喜欢的所有项目的列表,我在从db中获取信息时连接4列。如何从组合的逗号分隔列表中删除任何重复值?我更喜欢用PHP而不是Javascript

try {  
$stmt = $conn->prepare("SELECT * FROM customer_info WHERE user_id = :user_id"); 
$stmt->bindValue(':user_id', $user_id); 
$stmt->execute();
}catch(PDOException $e) {echo $e->getMessage();}
$row = $stmt->fetch();
$search = array('_', ',', 'Null');
$replace = array(' ', ', ', '');
$rows = str_replace($search, $replace, $row);

$merged_likes = $rows['items_like']. ",  " . $rows['first_like']. ",  " .     $rows['second_like']. ",  " .  $rows['third_like'];
echo $merged_likes; 

1 个答案:

答案 0 :(得分:0)

在处理事物列表时,最容易使用arrays。以逗号分隔的字符串可以正常显示,但在代码中使用它们并不好玩。考虑到这一点,我建议在最终将数据显示到屏幕之前不要触摸逗号。

不幸的是,听起来你已经在数据库中存储了逗号分隔的字符串。如果这是您可以更改的内容,您可能希望使用多个表来查看备用数据库结构,这些表在用户和他们喜欢的事物之间具有一对多关系。关于这一点可以说很多,但这不是你问题的主题。正如哈夫洛克已经提到的那样,基本概念被称为database normalization

如果无法更改数据库结构并且您必须使用逗号分隔列表,只需撤消逗号分隔并将它们返回到PHP中的数组中。为此,您需要使用explode()函数:

$teststring = '1,2,3';
$test = explode(',', $asdfstring); // array(1, 2, 3)

一旦你有了数组,PHP有一些方便的功能可以用于排序,删除重复项等。你最感兴趣的是array_unique()

要将其放回以逗号分隔的列表中进行显示,只需使用implode(),它与explode()相反,取一个数组并将其与您选择的分隔符连接(例如,逗号)。

既然你在这里处理了多个列,并且只需要一个列表,那么你将需要分多步构建数组。如果这些列中的每一列都可以包含多个值,则可以对所有列执行爆炸操作:

$items_like = explode(',', $rows['items_like']);
$first_like = explode(',', $rows['first_like']);
$second_like = explode(',', $rows['second_like']);
$third_like = explode(',', $rows['third_like']);
$merged = array_merge($items_like, $first_like, $second_like, $third_like);

或者,如果第一个,第二个和第三个只包含一个项目,您可以这样做:

$items_like = explode(',', $rows['items_like']);
$other_likes = array($rows['first_like'], $rows['second_like'], $rows['third_like']);
$merged = array_merge($items_like, $other_likes);

现在删除重复项:

$likes = array_unique($merged);

现在我们终于准备好添加逗号了:

echo implode(', ', $likes);