Удаление повторяющихся значений в списке, разделенном запятыми, в PHP

Как удалить повторяющиеся значения в списке с запятыми в PHP?

У меня есть 2 варианта вопросника клиента – один более подробный, чем другой, – и в одном они спрашивают, какие предметы им нравятся, а в другом им предлагается указать элементы, которые им нравятся в ранжированном порядке. В этом конкретном примере один из столбцов («items_like») может содержать несколько значений в списке, разделенном запятыми. Существуют два других сценария, в которых каждый из столбцов может содержать несколько значений в списке, разделенном запятыми.

Чтобы отобразить список всех элементов, которым нравится клиент, я объединяю 4 столбца, когда информация извлекается из db. Как я могу удалить любые повторяющиеся значения из объединенного списка с запятыми? Я бы предпочел сделать это на 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; 

При работе со списками вещей проще всего использовать массивы . Строки, разделенные запятыми, отлично работают для отображения вещей, но они не интересны для работы с кодом. Имея это в виду, я бы рекомендовал даже не касаться запятой, пока вы, наконец, не выведете данные на экран.

К сожалению, похоже, что у вас уже есть разделенные запятой строки, хранящиеся в вашей базе данных. Если это то, что вы можете изменить, вам может понадобиться изучить альтернативную структуру базы данных, используя несколько таблиц с отношением «один ко многим» между пользователями и тем, что им нравится. Об этом можно многое сказать, но это не вопрос вашего вопроса. Базовая концепция называется нормализацией базы данных , как уже упоминал Хавелок.

Если структура базы данных не может быть изменена, и вы должны работать с разделенными запятыми списками, просто отмените разделение запятой и верните их в массивы на 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);