web-dev-qa-db-ja.com

PHPのセットの組み込みサポート?

重複したエントリを許可しないが、他のセットまたは配列を簡単に組み合わせることができるPHPで配列を作成する簡単な方法を探しています。

私は、そのような機能が言語に存在するかどうかに主に興味を持っています。なぜなら、自分で書くのは難しくないからです。必要のない場合はしたくないだけです。

47
devios1

値の代わりに配列キーを使用すると、重複がないことが確実になります。また、これにより2つの「セット」を簡単にマージできます。

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

ソリューションが見つかりました: array_unique

配列に項目を追加してから、 array_unique 重複を削除し、最終的に同じ効果を達成します。唯一の欠点は、それを呼び出すことを忘れないでください。それを管理する実際のクラスがあればより良いでしょうが、これは私の目的には適しています。

29
devios1

答えは「いいえ」です。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);
1

Array_combineを使用して重複を削除できます

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

$map = array_combine($cars, $cars);
0
Preetam Purbia

In Laravel= uniqueクラスには有用なメソッドCollectionがあります。FromLaravel ドキュメント

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

私もこの問題を抱えていたので、クラスを書きました: https://github.com/jakewhiteley/php-set-object

提案されているように、ArrayObjectを拡張し、ネイティブ感覚の値の挿入/反復/削除を可能にしますが、array_unique()はどこでも使用しません。

実装は、EMCA 6 JavaScriptのセットのMDN JSドキュメントに基づいています。

0
Jake Whiteley