Built in support for sets in PHP?

PhpSet

Php Problem Overview


I'm looking for a simple way to create an array in php that will not allow duplicate entries, but allows for easy combining of other sets or arrays.

I'm mostly interested in whether such a feature exists in the language because writing my own wouldn't be difficult. I just don't want to if I don't need to.

Php Solutions


Solution 1 - Php

Just an idea, if you use the array keys instead of values, you'll be sure there are no duplicates, also this allows for easy merging of two "sets".

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

Solution 2 - Php

The answer is no, there is not a native set solution inside PHP. There is a Set data structure, but that is not baseline PHP.

There is a convention for implementing sets using maps (i.e. associative arrays) in any language. And for PHP you should use true as the bottom value.

<?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);

Solution 3 - Php

You can use array_combine for removing duplicates

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

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

Solution 4 - Php

I also had this problem and so have written a Class: https://github.com/jakewhiteley/php-set-object

As suggested, it does extend and ArrayObject and allow native-feeling insertion/iteration/removal of values, but without using array_unique() anywhere.

Implementation is based on the MDN JS Docs for Sets in EMCA 6 JavaScript.

Solution 5 - Php

In Laravel there is a method unique in Collection class that may be helpful. From Laravel documentation:

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

Solution 6 - Php

The Set class.

https://www.php.net/manual/en/class.ds-set.php

Don't know when will it come out.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questiondevios1View Question on Stackoverflow
Solution 1 - PhpzrvanView Answer on Stackoverflow
Solution 2 - PhpWilliam EntrikenView Answer on Stackoverflow
Solution 3 - PhpPreetam PurbiaView Answer on Stackoverflow
Solution 4 - PhpJake WhiteleyView Answer on Stackoverflow
Solution 5 - Phpmp31415View Answer on Stackoverflow
Solution 6 - PhpCharlie 木匠View Answer on Stackoverflow