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 int
You can use array_combine for removing duplicates
$cars = array("Volvo", "BMW", "Toyota");
array_push($cars,"BMW");
$map = array_combine($cars, $cars);
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]
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);
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;
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.