2011-01-17 10 views
3

私はPHP配列(コメントあり)を別に注文する必要があります。PHP配列を注文する

配列の内容の順序は次のようにする必要があります...

parent 
child 
    child 
    child 
parent 
child 
    child 
etc. 

親コメントは「= 0親」を持っています。 子コメントには親のID(「parent = 1」など)があります。 子コメントの深さ/量は不明です。

たとえば、このような配列がある場合、上記の順序で配列を取得するにはどうすればよいですか?

Array 
(
    [0] => Array 
     (
      [comment_id] => 1 
      [parent] => 0 
     ) 

    [1] => Array 
     (
      [comment_id] => 2 
      [parent] => 0 
     ) 

    [2] => Array 
     (
      [comment_id] => 3 
      [parent] => 1 
     ) 

    [3] => Array 
     (
      [comment_id] => 4 
      [parent] => 3 
     ) 

) 
+0

は、まあ、私は、これははるかに木を処理するための最良のsolutinoではないとしましょう。非常にリソースを消費しますが、これは通常、すべてのルートノードを印刷/保存し、次のレベルですべての子を選択し、それらの子を呼び出す再帰関数を使って行われます... "parent id tree node" 。 1000年前にベンをしたことがあります。 –

答えて

1

私のanswer hereから借りてください。あなたがチェックアウトすることができる同様の多くの質問があります。以下のような

何か:

<?php 
$p = array(0 => array()); 
foreach($nodes as $n) 
{ 
    $pid = $n['parent']; 
    $id = $n['comment_id']; 

    if (!isset($p[$pid])) 
    $p[$pid] = array('child' => array()); 

    if (isset($p[$id])) 
    $child = &$p[$id]['child']; 
    else 
    $child = array(); 

    $p[$id] = $n; 
    $p[$id]['child'] = &$child; 
    unset($p[$id]['parent']); 
    unset($child); 

    $p[$pid]['child'][] = &$p[$id];  
} 
$nodes = $p['0']['child']; 
unset($p); 
?> 
0

私は推測してみましょう:すべてのノードに「親」関係を格納するデータベースがあります。あなたが望むのは、その表現を標準の「ツリー」表現に変換することです。あなたのデータを持っているモデルの詳細理論:http://www.phpriot.com/articles/nested-trees-1

は、ここであなたがそれを行うことができます方法は次のとおりです。あなたは、データベースから得た配列を反復処理、そして、

class TreeNode { 
    public $commendId; 
    public $arrChildren; 
} 

:「ツリーノード」と呼ばれるクラスを作成します。各アイテムを処理し、アイテムを処理しているかどうかTreeNodeを作成します。深さ優先または幅優先優先アプローチを使用して、親を見つけてそれにノードをアタッチすることができます。