Встроенная поддержка наборов в PHP?


Я ищу простой способ создания массива в php, который не допускает дублирования записей, но позволяет легко комбинировать другие наборы или массивы.

Меня больше всего интересует, существует ли такая функция в языке, потому что написать свою собственную было бы несложно. Я просто не хочу, если мне это не нужно.

 38
Author: devios1, 2011-11-15

5 answers

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

$set1 = array ('a' => 1, 'b' => 1, );
$set2 = array ('b' => 1, 'c' => 1, );
$union = $set1 + $set2;
 57
Author: zrvan, 2011-11-14 21:42:41

Найдено решение: array_unique

Просто добавьте элементы в массив, а затем вызовите array_unique для удаления дубликатов, что в конечном итоге приводит к тому же эффекту. Единственный недостаток в том, что вы должны помнить, как это назвать. Было бы лучше, если бы для этого существовал настоящий класс, но для моих целей это нормально.

 27
Author: devios1, 2013-02-06 19:11:02

У меня тоже была эта проблема, и поэтому я написал класс: https://github.com/jakewhiteley/php-set-object

Как и предлагалось, он расширяет и ArrayObject и позволяет вставлять/повторять/удалять значения в собственном стиле, но без использования array_unique() в любом месте.

Реализация основана на документах MDN JS для наборов в JavaScript EMCA 6.

 0
Author: Jake Whiteley, 2016-05-22 14:25:53

Вы можете использовать array_combine для удаления дубликатов

$cars = array("Volvo", "BMW", "Toyota");
array_push($cars,"BMW");

$map = array_combine($cars, $cars);
 0
Author: Preetam Purbia, 2016-09-08 18:13:59

В Laravel есть метод unique в классе Collection, который может быть полезен. Из документации Laravel :

$collection = collect([1, 1, 2, 2, 3, 4, 2]);
$unique = $collection->unique();
$unique->values()->all();
// [1, 2, 3, 4]
 0
Author: mp31415, 2016-09-12 19:04:13