3

これについて他の質問を見たことがありますが、私の状況はあまり好きではありません。MySQL に次のテーブルがあります。

   term_id       name           slug                 taxonomy     parent
1             Entry Form     entry-form           format       0
2             Page           page                 format       3
3             Facebook       facebook             format       0
4             Entry Form     facebook-entry-form  format       3
5             Twitter        twitter              format       0
6             Single        single                format       2

次の OBJECT クエリがあります。

$formats = $wpdb->get_results($wpdb->prepare("
    SELECT * FROM table t
    WHERE t.taxonomy = 'format'
"));

私は次の配列で終わります:

Array ( [0] => stdClass Object ( [term_id] => 1 [name] => Entry Form [slug] => entry-form [taxonomy] => format [parent] => 0 ) [2] => stdClass Object ( [term_id] => 2 [name] => Page [slug] => page [taxonomy] => format [parent] => 3 ) [3] => stdClass Object ( [term_id] => 3 [name] => Facebook [slug] => facebook [taxonomy] => format [parent] => 0 ) [4] => stdClass Object ( [term_id] => 4 [name] => Entry Form [slug] => entry-form-facebook [taxonomy] => format [parent] => 3 ) [5] => stdClass Object ( [term_id] => 5 [name] => Twitter [slug] => twitter [taxonomy] => format [parent] => 0 ) [6] => stdClass Object ( [term_id] => 6 [name] => Single [slug] => single [taxonomy] => format [parent] => 2 ) ) 1

上記のすべてを、次のような出力の階層リストに変換する必要があります。

Entry Form
Twitter
Facebook
 - Entry Form
 - Page
 -- Single

そのため、配列 $formats を親フィールドに基づいて階層配列に変換する必要があります。0 の親は、それがトップ レベルのアイテムであることを意味します。そのため、Single には 2 の親があるため、Page の子であり、Page は 3 の親を持ち、Facebook の子です。

配列を階層配列に変換して、それをループして出力する方法を教えてくれる人はいますか?

4

2 に答える 2

0

クエリの量によるパフォーマンスが問題にならない場合、最も簡単な解決策は、配列にデータを入力する単一のクエリを実行する代わりに、階層ツリーのノードごとに1つのクエリを実行し、「AND親= $ id "、ここで$idは現在のノードのterm_idです。何かのようなもの:

  1. SELECT WHERE .... AND parent=0を実行します。
  2. 1の結果ごとに、$ id = term_id、選択WHERE ... AND parent =$idを実行します
  3. 結果がなくなるまで再帰的に繰り返します

パフォーマンスが問題になる場合でも、クエリを配列にダンプして同じアルゴリズムを配列に適用できますが、実際に大量のボリュームがある場合は、その方法でメモリの問題が発生する可能性があります。

于 2013-01-06T02:10:44.100 に答える
0

データベースからデータをフェッチするときに、データを連想配列に入れる必要があります。

//$groups - result array

$groups = array();

//$record contains the assoc array of the current record
while($record = $result->fetchAssoc()) {
      if (!isset($groups[$record["parent"]]))
      {
            $groups[$record["parent"]] = array();
      }

      array_push($groups[$record["parent"]], $record);
}

最後に、親をキーとする階層の連想配列を取得します。次に、再帰的にトラバースすると、次の結果が得られます。

function print_recursively(&$groups, $parent_id, $dashes = '')
{
    if(isset($groups[$parent_id]))
    {
          foreach($groups[$parent_id] as $key => $value)
          {
                print $dashes . ' ' . $value["name"];
                print_recursively(&$groups, $value["term_id"], $dashes . '-');
          }
    }
}

このコードはテストしていませんが、アルゴリズムは正しいです。

于 2013-01-06T02:11:09.867 に答える