2012-05-11 7 views
1

フラットなリストがあります。リスト内の項目の一部は、リスト内の他の項目の親です。私は各項目を通過し、それが無効でないことを確認する必要があります。各アイテムに有効期限があり、アイテムが所有アイテムまたはその親の有効期限が過ぎているアイテムは無効です。無効なアイテムをリストからすべて効率的に削除するにはどうすればよいですか?PHPのフラットな配列で無効なブランチを階層から削除する

本質的には、配列内に階層的なデータセットが与えられています。各項目には、それ自身のID、親ID、時刻情報、および他の有用でないデータがあります。

これは、複数のルートノードが存在する可能性があるため、やや複雑です。アイテムにはparentIDがありません。ルートノードです。

アレイの例(日時やその他の情報は省略):

Array 
(
    [0] => MyObject 
     (
      [id:protected] => 1 
      [parentID:protected] => 2 
     ) 

    [1] => MyObject 
     (
      [id:protected] => 4 
     ) 

    [2] => MyObject 
     (
      [id:protected] => 2 
      [parentID:protected] => 4 
     ) 

    [3] => MyObject 
     (
      [id:protected] => 3 
     ) 

    [4] => MyObject 
     (
     [id:protected] => 5 
     [parentID:protected] => 3 
    ) 
) 

は、私が最初の段落に応じて無効であるすべての項目を削除するための効率的な方法を見つけて、残りの項目の配列を返したいです。

おかげ

答えて

0

は私が行うための最も効率的なものは、すべての項目を単にループにあると思いますし、自己の期限が切れているノードを削除します。これを行うと、ツリーを後で構築するとき(私は最終的にあなたが想定します)、自己期限切れ基準によって手動で削除されなかったアイテムは、祖先がないために孤立し、祖先が期限切れの基準をカバーします。必要に応じてツリーを平らに戻すことができますが、最終的にはツリーが欲しいと思います。

+0

私は実際に最後にツリーを望んでいません、残りのアイテムの配列を返したいと思います。枝刈りを行うツリーを作ることが効率的であればそれは一つのことですが、私はそれを最後に配列にする必要があります。 – Eebs

+0

それは最適に非常に近いだろう。ツリーを構築する必要はありませんが、ツリーの構築は、期限切れのノードを削除した後に実行する必要があります。残りのノードにルートノードへのパスがあることを確認してください。私は、オブジェクトに格納されている他のデータがないと仮定しています。例えば、 "先祖のIDは常にその子孫のIDよりも小さい"などの祖先を素早く見つける能力を向上させることができます。 。 – goat

関連する問題