重複したエントリを許可しないが、他のセットまたは配列を簡単に組み合わせることができるPHPで配列を作成する簡単な方法を探しています。
私は、そのような機能が言語に存在するかどうかに主に興味を持っています。なぜなら、自分で書くのは難しくないからです。必要のない場合はしたくないだけです。
値の代わりに配列キーを使用すると、重複がないことが確実になります。また、これにより2つの「セット」を簡単にマージできます。
$set1 = array ('a' => 1, 'b' => 1, );
$set2 = array ('b' => 1, 'c' => 1, );
$union = $set1 + $set2;
ソリューションが見つかりました: array_unique
配列に項目を追加してから、 array_unique
重複を削除し、最終的に同じ効果を達成します。唯一の欠点は、それを呼び出すことを忘れないでください。それを管理する実際のクラスがあればより良いでしょうが、これは私の目的には適しています。
答えは「いいえ」です。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);
Array_combineを使用して重複を削除できます
$cars = array("Volvo", "BMW", "Toyota");
array_Push($cars,"BMW");
$map = array_combine($cars, $cars);
In Laravel= unique
クラスには有用なメソッドCollection
があります。FromLaravel ドキュメント :
$collection = collect([1, 1, 2, 2, 3, 4, 2]);
$unique = $collection->unique();
$unique->values()->all();
// [1, 2, 3, 4]
私もこの問題を抱えていたので、クラスを書きました: https://github.com/jakewhiteley/php-set-object
提案されているように、ArrayObjectを拡張し、ネイティブ感覚の値の挿入/反復/削除を可能にしますが、array_unique()
はどこでも使用しません。
実装は、EMCA 6 JavaScriptのセットのMDN JSドキュメントに基づいています。