2009-10-01 10 views
7

誰かがSplObjectStorageを使って固有のものを追跡することを提案しました。文字列では機能しない点を除いて、素晴らしいです。エラーは、 "SplObjectStorage :: attach()は、パラメータ1がオブジェクトであることを期待しています、59行目のfback.phpに指定された文字列"SplObjectStorageはStringで動作しません。どうすればよいですか?

アイデアはありますか?

答えて

8

SplObjectStorageは、オブジェクトの名前を格納する格納クラスです。他のいくつかのプログラミング言語とは対照的に、stringsはPHPのオブジェクトではありませんが、文字列です;-)。したがって、stdClassのオブジェクトに文字列をラップしても、文字列をSplObjectStorageに格納するのは意味がありません。

ユニークな文字列のコレクションを格納する最良の方法は、文字列をキーとして配列(ハッシュテーブルとして)と値(Ian Selbyのように)を使用することです。

$myStrings = array(); 
$myStrings['string1'] = 'string1'; 
$myStrings['string2'] = 'string2'; 
// ... 

ただし、カスタムクラスにこの機能をラップすることができます:

class UniqueStringStorage // perhaps implement Iterator 
{ 
    protected $_strings = array(); 

    public function add($string) 
    { 
     if (!array_key_exists($string, $this->_strings)) { 
      $this->_strings[$string] = $string; 
     } else { 
      //.. handle error condition "adding same string twice", e.g. throw exception 
     } 
     return $this; 
    } 

    public function toArray() 
    { 
     return $this->_strings; 
    } 

    // ... 
} 

あなたはさんがPHP < 5.3.0用SplObjectStorageの動作をシミュレートし、何それのより良い理解を得るために、ところでそうです。

$ob1 = new stdClass(); 
$id1 = spl_object_hash($ob1); 
$ob2 = new stdClass(); 
$id2 = spl_object_hash($ob2); 
$objects = array(
    $id1 => $ob1, 
    $id2 => $ob2 
); 

SplObjectStorage格納(spl_object_hash()等)、各インスタンスに一意のハッシュ にオブジェクトインスタンスを識別することができます。上記のとおり、文字列はオブジェクトではないため、インスタンスハッシュはありません。文字列の一意性は、文字列の値を比較することによってチェックできます.2つの文字列は、同じバイトセットを含むときに等しくなります。

1

stdClassに文字列をラップしますか?

$dummy_object = new stdClass(); 
$dummy_object->string = $whatever_string_needs_to_be_tracked; 
$splobjectstorage->attach($dummy_object); 

しかし、この方法で作成したすべてのオブジェクトは、まだ文字列が同一であっても、独特のだろう。

重複する文字列を心配する必要がある場合は、おそらくハッシュ(連想配列)を使用してそれらを追跡する必要がありますか?

+0

あなたはいくつかのサンプルを提供することができます一意の文字列のセットを格納し、それらを反復処理する方法についてのコード?なぜそれはPHPで非常に難しいですか? – erotsppa

+2

アレイに保存できませんでしたか?あなたは少し複雑に思っているようです;) –

0
$myStrings = array(); 
$myStrings[] = 'string1'; 
$myStrings[] = 'string2'; 
... 

foreach ($myStrings as $string) 
{ 
    // do stuff with your string here... 
} 

あなたは物事のカップルを行うことができ、配列内の文字列の一意性を確保したい場合は...まず、単純にarray_unique使用することです()。それか、キーだけでなく、値として文字列で連想配列を作成することができます。

$myStrings = array(); 
$myStrings['string1'] = 'string1'; 
... 

あなたはオブジェクト指向この程度にしたい場合は、あなたが何か行うことができます:

class StringStore 
{ 
    public static $strings = array(); 

    // helper functions, etc. You could also make the above protected static and write public functions that add things to the array or whatever 
} 

次に、あなたのコードでは、あなたは次のようなものを行うことができます。

StringStore::$strings[] = 'string1'; 
... 

と同じように繰り返す:

SplObjectStorageは、オブジェクトの一意のインスタンスを追跡するためのもので、文字列で作業していない場所では、私の考えでは達成しようとしていることに対して少し残酷です。

希望に役立ちます!

5

これはオブジェクトストレージです。文字列はスカラーです。したがって、SplStringを使用してください。

0

または多分ちょうど__toStringを持つオブジェクト()メソッドとして、あなたの文字列をインスタンス化 - あなたはそれらの両方を持つことができる方法 - オブジェクトと文字列(のvar_dump、エコー)としてそれを使用する機能。..