Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

$set1 = array ('a' => 1, 'b' => 1, );
$set2 = array ('b' => 1, 'c' => 1, );
$union = $set1 + $set2;

Ответ 2

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

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

Ответ 3

Ответ - нет, в PHP нет встроенного решения для множеств. Существует структура данных Set, но это не базовый PHP.

Существует соглашение для реализации множеств с использованием карт (то есть ассоциативных массивов) на любом языке. А для PHP вы должны использовать true в качестве нижнего значения.

<?php

$left = [1=>true, 5=>true, 7=>true];
$right = [6=>true, 7=>true, 8=>true, 9=>true];

$union = $left + $right;
$intersection = array_intersect_assoc($left, $right);

var_dump($left, $right, $union, $intersection);

Ответ 4

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

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

Реализация основана на MDN JS Docs for Sets в EMCA 6 JavaScript.

Ответ 5

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

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

$map = array_combine($cars, $cars);

Ответ 6

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

$collection = collect([1, 1, 2, 2, 3, 4, 2]);
$unique = $collection->unique();
$unique->values()->all();
// [1, 2, 3, 4]