0

データベースに保存されているカテゴリを表示しようとしています:

http://dl.dropbox.com/u/16459516/Screen%20shot%202012-05-05%20at%2015.59.40.png

私の考えは、モデル内のデータベースからすべてのデータを取得し、関数内で配列を再構築することでした:

function get_all_categories() {

    $query = $this->db->query('SELECT * FROM categories');

    //code to reconstruct my array like:
    //foreach($query->result_array() as $row) {
        //$categories[$row['niveau_1']] = array[]
    //}

    return $categories;
}

次のような配列を出力します。

[0] => Array
       (
       [niveau_1] => main category name
       [niveau_2] => Array(
                        ...children here and children of these childs
                        )
       )

誰もこれを行う方法を知っていますか? ここで立ち往生していて、配列の作成方法がわかりません...ビューに表示する方法は知っていますが、配列に入れるのは難しいようです。

前もって感謝します!

4

3 に答える 3

2

これはアイデアです:

  1. foreach カテゴリ (レベル 4 を除く) が結果配列に存在するかどうかを確認します( $c)
  2. そうでない場合は、カテゴリの名前のラベルを使用して配列を作成します
  3. カテゴリ2と3を制御したら、生成された配列内に最後のカテゴリを挿入できます

$query = $this->db->query('SELECT * FROM カテゴリ');

$raw_categories = $query->result_array();

$c = array();

foreach($raw_categories AS $row)
{
   if(!array_key_exists($row['niveau_2'],$c) && !empty($row['niveau_2']))
   {
      $c[$row['niveau_2']] = array();
   }

   if(!array_key_exists($row['niveau_3'],$c[$row['niveau_2']]) && 
      !empty($row['niveau_3']))
   {
      $c[$row['niveau_2']]['niveau_3'] = array();
   }

   $c[$row['niveau_2']]['niveau_3'][] = $row['niveau_4'];
}

これはテストされていませんが、アイデアとして使用できます

于 2012-05-05T16:55:51.823 に答える
1

データベースが間違っていると思います。私が理解しているように、それは「目次」または類似のもの(カテゴリ、サブカテゴリ、サブサブカテゴリなど)です。「1.Visie、Beleid...」が何度も出てきます。

もしそうなら、データベースを変更します:

table niveau_1
    id_1 - primary key
    title - string
table niveau_2
    id_2 - primary key
    id_1 - connect to niveau_1 (which niveau_1 is its 'parent')
    title - string
table niveau_3
    id_3 - primary key
    id_2 - connect to niveau_2 (which niveau_2 is its parent)
    title - string

この場合、データベースでは要素が複製されず、目的のクエリがより簡単になると思います:

SELECT
  niveau_1.title AS title_1,
  GROUP_CONCAT(niveau_2.title,"@") AS title_2,
  GROUP_CONCAT(niveau_3.title,"@") AS title_3
FROM niveau_1
LEFT JOIN niveau_2 ON niveau_2.id_1=niveau_1.id_1
LEFT JOIN niveau_3 ON niveau_3.id_2=niveau_2.id_2
GROUP BY niveau_2.id_2

このクエリは半分の解決策にすぎません。完全ではありませんが、ここから始めることができます。

于 2012-05-06T12:07:40.783 に答える
0
// your model using activerecord
public function getCategories(){
  $q = $this->db->get('categories');
  if($q->num_rows > 0){
    return $q->result();
  }else{
    return false;
  }
}

//your controller
$this->load->model('category_model');
$data['results'] = $this->category_model->getCategories();
foreach($data['results'] as $c){
  //iterate through categories, match them to points.
  //match category_id in results with category_id in the other table results
  //setup a multi dimensional array to build up what you need.
}
于 2012-05-05T16:52:48.050 に答える