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


Removing duplicate values within a comma separated list in PHP

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

我有两个版本的客户问卷——一个比另一个更详细——在一个版本中,他们被问到他们喜欢的项目,在另一个版本,他们被要求按排名顺序指定他们喜欢的内容。在这个特定的示例中,其中一列('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; 

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

不幸的是,听起来数据库中已经存储了逗号分隔的字符串。如果这是你可以改变的,你可能想研究一个替代的数据库结构,使用多个表,用户和他们喜欢的东西之间有一对多的关系。关于这件事,我们可以说很多,但这不是你问题的主题。正如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);