0

私はビジネス ディレクトリのようなものに取り組んでおり、カテゴリ リストでカテゴリの再帰的な親を表示する必要があります。

そのために次の関数を使用しています:

    public function get_recursive_parents($category_id){
        $categories = array();
        $res = $this->db->from('categories')->where('cat_id',$category_id)->get()->row_array();
        $cat_id = $res['parent_id'];
        $categories[] = $res;
        while($cat_id){
            $res = $this->db->from('categories')->where('cat_id',$cat_id)->get()->row_array();
            $categories[] = $res;
            $cat_id = $res['parent_id'];
        }
        return $categories;
    }

私はこの機能を使用しており、管理サイトにあるため、管理サイトで少し遅くても問題ありません。管理者は1人だけなので、より多くのメモリを割り当てることができます.しかし、1回の呼び出しで300M以上のメモリを制限すると思います.多すぎて、まだこれを取得しています:

Fatal error: Allowed memory size of 367001600 bytes exhausted (tried to allocate 72 bytes) in /var/www/usmanproject/salesfinder/system/database/DB_active_rec.php on line 2007 

上記の機能を最適化する方法はありますか?または、特定の種類のインデックス作成やアルゴの最適化、またはその他の可能な方法を行う必要がありますか? または、カテゴリのすべての親とスーパー親の表示を停止するだけですか (つまり、階層を表示するクライアントの要求です)? または、すでにディレクトリで作業していて、管理サイトでも遅かったので、メモリを増やす必要があるので、メモリを増やしただけだと思いますか?

アドバイスをいただければ幸いです。


これがそのテーブルスキーマです。parent_id があるため、再帰的な関係として機能しています。

   CREATE TABLE IF NOT EXISTS `categories` (
  `cat_id` int(11) NOT NULL AUTO_INCREMENT,
  `cat_name` varchar(255) DEFAULT NULL,
  `cat_title` varchar(255) DEFAULT NULL,
  `cat_desc` varchar(255) DEFAULT NULL,
  `cat_text` text,
  `parent_id` int(11) NOT NULL,
  `cat_img` varchar(255) DEFAULT NULL,
  `sort_id` int(11) NOT NULL DEFAULT '1',
  `last_level` tinyint(4) NOT NULL,
  PRIMARY KEY (`cat_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=221 ;
4

2 に答える 2

0

以下のコードを使用してみてください

public function get_recursive_parents($category_id,$categories=array())
{
    if($category_id!="")
    {
        $new_ar1=array();
        $fe = $this->db->from('categories')->where('cat_id',$category_id)->get()->row_array();
        array_push($new_ar1,$fe["parent_id"]);
        return $new_ar1;
    }
    else
    {
        $res = $this->db->from('categories')->get()->row_array();
        array_push($categories,$res['parent_id']);
        $categories[$res['parent_id']]=array();

        array_push($categories[$res['cat_id']],get_recursive_parents($res['parent_id'],$categories));
    }

    return $new_ar;
}

関数を呼び出す

get_recursive_parents($category_id);

それがあなたを助けることを願っています

于 2013-02-16T12:15:57.357 に答える
0

問題は解決しました。実際には、主キーであるparent_idそれ自体を指しているレコードがありました。cat_idつまり、それはそれ自体を指していて、その場合、その再帰は単純に終了していませんでした。while ループを使用しましたが、この場合は無限になります。

ただし、デバッグ中に役立つこの投稿を見つけました。 http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ 同じことを処理するためのより良い方法を提供します。私のシナリオでは、この投稿で述べたように自己結合が役立ちます。

于 2013-02-17T01:07:01.340 に答える