2017-11-05 1 views
0

私はクラスのコレクションを持っており、配列内で一意であるかどうかをフィルタリングする必要があります。クラスを持つ配列:一意性をチェックしてください

私のアプローチ:

public function unique() { 
    $uniqueStreams = []; 

    foreach($this->streams as $stream) { 
     if(!in_array($stream, $uniqueStreams)) { 
      $uniqueStreams[] = $stream; 
     } 
    } 

    return new static($uniqueStreams); 
} 

問題は(少なくとも、それは私が調査したものです)、そのクラス名のexistanceのためにそのin_arrayのみをチェックしているが、私は、彼らがいないだことを確認する必要があります同一のクラスからのものであることが望ましい)。

+0

'array_unique($ this-> streams、SORT_REGULAR)'はあなたのために機能しませんか? – apokryfos

+0

一意性の基準は何ですか? –

+0

@apokryfosうん、それは私にとってはうまくいかない。上記のように動作しますが、インスタンスをチェックするだけですが、プロパティが異なる場合でも同じインスタンスに基づいていても、それらはまだ一緒ではありません。 – jens1o

答えて

1

@u_mulderが判明したので、それらをシリアライズして文字列を比較することで、課題を解決しています!

public function unique() { 
    $uniqueStreams = []; 

    foreach($this->streams as $stream) { 
     $serialized = serialize($stream); 
     if(!in_array($serialized, $uniqueStreams)) { 
      $uniqueStreams[] = $serialized; 
     } 
    } 

    foreach($uniqueStreams as &$uniqueStream) { 
     $uniqueStream = unserialize($uniqueStream); 
    } 

    return new static($uniqueStreams); 
} 
関連する問題