多くの言語には「セット」データ構造があり、通常、特定のオブジェクトコレクションからの一意の値のみが含まれます。たとえば、整数1、4、5、1、2、および6をセットに追加すると、最終的にセットには実際には1、4、5、2、および6のみが含まれます。
PHPでこのようなコレクションを観察したことはありません。そのようなコレクションが言語に組み込まれていますか、それとも何かをカスタムロールする必要がありますか?
PHP言語の「Set」コレクションのタイプに気づかなかったので、セットをシミュレートするための独自のメソッドを使用しました。ハッシュテーブルのようなセットにアプローチします。デフォルトでは、ハッシュテーブルのキーはセットに属しています。これを有利に使用できます。
たとえば、ランダムに生成された整数の配列があるとします$random_integers
。以下は、に含まれる値の一意の配列を生成します$random_integers
。
$random = array(1,1,1,3,4,5,3,45,7);
$set = array();
foreach($random as $key => $value) {
$set[$value] = 1;
}
$set = array_keys($set);
print_r($random);
print_r($set);
array_keys
PHPに含まれる関数です。これを使用して、セットに相当するすべてのキーをハッシュテーブルから抽出できます。
ここでの落とし穴は、整数と文字列のみを配列キーとして使用できることです。したがって、使用しているオブジェクトをセットに含める場合は、何らかの文字列または整数表現が必要になります。
また、私の例では、配列キーを抽出するために余分な手順を実行する必要がないことに注意してください。 $set
すでにセットです。呼び出しarray_keys
は、必要になった場合に固有の値を提供するだけです。
何かが組み込まれていることは間違いありませんが、達成するのは非常に簡単です。
<?
$set = array(1, 4, 5, 1, 2, 6); // original set
$set = array_unique($set);
//$set = array_values($set); // add this to reset the keys
print_r($set); // returns 1, 4, 5, 2 and 6.
PHPコアの一部であるこのようなコレクションはありません。配列キーを使用するか、を使用すると、かなり近づくことができますSplObjectStorage
。
昔、Turbo Pascal は 255 までの値を格納するための SET 型をサポートしていました。使用されたメカニズムは非常に単純で、32 バイトの配列を使用し、セット内の各値は 32*8=256 ビットのいずれかに格納されました。この配列。配列 [0] のビット 0 に格納された値 0、配列 [0] のビット 1 に格納された値 1 .. 配列 [31] のビット 7 に格納された値 255 :
値のバイトとビットを見つける:
BYTEPOS = $value >> 3 (0..7 => 0, 8..15 => 1 etc)
BITPOS = $value & 7 (0,8,16 ... => bit 0 1,9,17 => bit 1 etc)
空のセット [0..255];
$theSET = array( 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 );
値の追加:
$theSET[ $value >> 3 ] = $theSET [ $value >> 3 ] | (1 << ($value & 7));
削除 :
$theSET[ $value >> 3 ] = $theSET [ $value >> 3 ] & ~(1 << ($value & 7));
チェック中 :
inSET = ($theSET [ $value >> 3 ] & (1 << ($value & 7)) == (1 << ($value & 7));
2 つのセットに対する操作は反復として実行できます。
組み合わせる:
$SetA[$i] = $SetA[$i] | $SetB[$i]
SetB にない値のみ:
$SetA[$i] = $SetA[$i] & (~$SetB[$i])
ect