フラットなリストがあります。リスト内の項目の一部は、リスト内の他の項目の親です。私は各項目を通過し、それが無効でないことを確認する必要があります。各アイテムに有効期限があり、アイテムが所有アイテムまたはその親の有効期限が過ぎているアイテムは無効です。無効なアイテムをリストからすべて効率的に削除するにはどうすればよいですか?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
)
)
は、私が最初の段落に応じて無効であるすべての項目を削除するための効率的な方法を見つけて、残りの項目の配列を返したいです。
おかげ
私は実際に最後にツリーを望んでいません、残りのアイテムの配列を返したいと思います。枝刈りを行うツリーを作ることが効率的であればそれは一つのことですが、私はそれを最後に配列にする必要があります。 – Eebs
それは最適に非常に近いだろう。ツリーを構築する必要はありませんが、ツリーの構築は、期限切れのノードを削除した後に実行する必要があります。残りのノードにルートノードへのパスがあることを確認してください。私は、オブジェクトに格納されている他のデータがないと仮定しています。例えば、 "先祖のIDは常にその子孫のIDよりも小さい"などの祖先を素早く見つける能力を向上させることができます。 。 – goat