0

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

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

为了显示客户喜欢的所有商品的列表,我在从数据库中获取信息时连接了 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; 
4

1 回答 1

0

在处理事物列表时,使用数组是最简单的。逗号分隔的字符串可以很好地显示内容,但在代码中使用它们并不有趣。考虑到这一点,我建议在您最终将数据显示到屏幕上之前不要触摸逗号。

不幸的是,听起来您已经在数据库中存储了逗号分隔的字符串。如果这是您可以更改的内容,您可能希望研究使用多个表的替代数据库结构,这些表在用户和他们喜欢的事物之间具有一对多的关系。关于这个有很多可以说的,但这不是你问题的主题。正如 Havelock 已经提到的,基本概念称为数据库规范化。

如果无法更改数据库结构并且您必须使用逗号分隔的列表,只需撤消逗号分隔并将它们重新放入 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);
于 2013-02-23T21:23:41.443 回答