親メッセージへの参照を含むメッセージの配列があります。次のようになります。
array (
'm1' => array ('m9'),
'm5' => array ('m3', 'm4', 'm2'),
'm2' => array ('m1'),
'm3' => array ('m2', 'm1', 'm8'),
'm6' => array ('m7'),
'm4' => array ('m3', 'm2'),
)
この配列のキーはメッセージ ID で、値は0 個以上の親 ID への参照です (順不同)。ID の順序はランダムである可能性があり、参照された親 ID が特定のメッセージ セットに含まれているとは限りません。
私がする必要があるのは、これらのメッセージを「スレッド ビュー」にグループ化することです。基本的に、この配列を次のようなものに変換する必要があります。
array(
'm1' => array('m1', 'm2', 'm3', 'm4', 'm5'),
'm6' => array('m6')
);
すべてのメッセージは、最上位メッセージでグループ化されたスレッドに割り当てられる必要があります。親への参照がない場合、または参照された親がセットに存在しない場合、メッセージはトップレベルであると見なされます。メッセージ 'm1' と 'm6' は、指定されたセットに 'm9' と 'm7' がないため、トップレベルです。メッセージ 'm3' は、存在しない 'm8' への参照にもかかわらず 'm1' スレッドにあります - それを 'm1' にリンクする他の既存の親があります。
私の質問は、それを行う方法と、効率的に行う方法です。どんな助けでも大歓迎です。
アップデート:
私が思いついたのは、最初にこれらの関係を逆にすることです。したがって、次のようになります。
array (
'm9' => array ('m1'), # this would be rejected
'm3' => array ('m5', 'm4'),
'm4' => array ('m5'),
'm2' => array ('m5', 'm3', 'm4'),
'm1' => array ('m2', 'm3'),
'm8' => array ('m3'), # this would be rejected
'm7' => array ('m6'), # this would be rejected
)
次に、入力キーには存在するが変換された配列には存在しないため、キー 'm6' と 'm5' を子なしで追加します。
これで、入力データで見つけることができるすべての関係の親 => 子ができました。この配列のキーを入力配列と比較した後、キー「m9」、「m8」、および「m7」を存在しないとして拒否できます。
最終的に、配列は次のようになります。
array (
'm3' => array ('m5', 'm4'),
'm4' => array ('m5'),
'm2' => array ('m5', 'm3', 'm4'),
'm1' => array ('m2', 'm3'),
'm6' => array(),
'm5' => array()
)
私が今しなければならないことは、この構造をどうにかして平らにすることです。別の親p2の子でもあるすべての親p1を検索し、 p1の子をp2の子に追加する必要があります。これらの配列を何度も繰り返す以外の方法でそれを行う方法はわかりませんが、ここではオプションではありません。