ホームページ > バックエンド開発 > PHPチュートリアル > もっと良い方法をお探しですか~?

もっと良い方法をお探しですか~?

WBOY
リリース: 2016-06-23 13:46:13
オリジナル
806 人が閲覧しました

次のようなデータ:

INSERT INTO `vm_nav` (`id`, `ctype`, `cid`, `name`, `ifshow`, `vieworder`, `opennew`, `url`, `type`) VALUES(1, NULL, 0, 'index', 0, 1, 0, '', 'nav'),(2, NULL, 0, 'product', 1, 2, 0, '', 'nav'),(3, NULL, 0, 'member', 1, 3, 0, '', 'nav'),(4, NULL, 0, 'guide', 1, 4, 0, '', 'nav'),(5, NULL, 0, 'kehu', 1, 5, 0, '', 'nav'),(6, NULL, 0, 'about', 1, 6, 0, '', 'nav'),(7, NULL, 0, 'tehui', 1, 7, 0, '', 'nav'),(8, NULL, 3, 'member_index', 1, 1, 0, '', 'nav'),(9, NULL, 3, 'member_info', 1, 2, 0, '', 'nav');
ログイン後にコピー


この種のデータを探しています
array(8) {  [0]=>  array(6) {    ["id"]=>    string(1) "2"    ["name"]=>    string(12) "product"    ["opennew"]=>    string(1) "0"    ["url"]=>    string(0) ""    ["ctype"]=>    NULL    ["cid"]=>    string(1) "0"  }  [1]=>  array(6) {    ["id"]=>    string(1) "3"    ["name"]=>    string(18) "member"    ["opennew"]=>    string(1) "0"    ["url"]=>    string(0) ""    ["ctype"]=>    NULL    ["cid"]=>    string(1) "0"  }  [2]=>  array(6) {    ["id"]=>    string(1) "8"    ["name"]=>    string(12) "member_index"    ["opennew"]=>    string(1) "0"    ["url"]=>    string(0) ""    ["ctype"]=>    NULL    ["cid"]=>    string(1) "3"  }  [3]=>  array(6) {    ["id"]=>    string(1) "9"    ["name"]=>    string(12) "member_info"    ["opennew"]=>    string(1) "0"    ["url"]=>    string(0) ""    ["ctype"]=>    NULL    ["cid"]=>    string(1) "3"  }  [4]=>  array(6) {    ["id"]=>    string(1) "4"    ["name"]=>    string(12) "guide"    ["opennew"]=>    string(1) "0"    ["url"]=>    string(0) ""    ["ctype"]=>    NULL    ["cid"]=>    string(1) "0"  }  [5]=>  array(6) {    ["id"]=>    string(1) "5"    ["name"]=>    string(12) "kehu"    ["opennew"]=>    string(1) "0"    ["url"]=>    string(0) ""    ["ctype"]=>    NULL    ["cid"]=>    string(1) "0"  }  [6]=>  array(6) {    ["id"]=>    string(1) "6"    ["name"]=>    string(12) "about"    ["opennew"]=>    string(1) "0"    ["url"]=>    string(0) ""    ["ctype"]=>    NULL    ["cid"]=>    string(1) "0"  }  [7]=>  array(6) {    ["id"]=>    string(1) "7"    ["name"]=>    string(12) "tehui"    ["opennew"]=>    string(1) "0"    ["url"]=>    string(0) ""    ["ctype"]=>    NULL    ["cid"]=>    string(1) "0"  }}
ログイン後にコピー


私は愚かな方法を使用しました: 最初に foreach で息子メンバーに cid を挿入し、次にその後ろに foreach を置きます。 説明は明確ではありません。コードは次のとおりです。以下:

function nav_list(){    $navlist = get_navigator();    sort($navlist['nav']);   //$navlist['nav']  就是取出所有数据 ,上面用sort排了下序    foreach($navlist['nav'] as $k=>$v)    {        if($v['cid'] != 0)        {            //插入到一个son成员里            $l[$v['cid']]['son'][] = $v;                    }else{        	$l[$v['id']] = $v;        }    }    foreach($l as $k=>$v){        if($v['son']){            //消除son成员            $tmp[] = array_diff_key($v,array('son'=>''));            foreach($v['son'] as $key=>$val){                //再一个foreach 放到其后面                $tmp[] = $val;            }        }else{            $tmp[] = $v;        }    }    return $tmp;}
ログイン後にコピー


~ どうすれば速くなりますか ~? ? ?解決


ディスカッションに返信 (解決策)

if(cid == id)
この cid データは id データの後ろに配置されています。明確に説明できません~~~~

select id, ctype, cid, name, ifshow, vieworder, opennew, url, type from vm_nav where ifshow and cid=0unionselect cid as id, ctype, cid, name, ifshow, vieworder, opennew, url, type from vm_nav where ifshow and cid>0order by id
ログイン後にコピー
ログイン後にコピー

を変換します。 1桁の配列を2次元に変換しますか?

select id, ctype, cid, name, ifshow, vieworder, opennew, url, type from vm_nav where ifshow and cid=0unionselect cid as id, ctype, cid, name, ifshow, vieworder, opennew, url, type from vm_nav where ifshow and cid>0order by id
ログイン後にコピー
ログイン後にコピー


こうして取り出したデータのcidは
INSERT INTO `vm_nav` (`id`, `ctype`, `cid`, `name`, `ifshow`, `vieworder`, `opennew`, `url`, `type`) VALUES(2, NULL, 0, 'product', 1, 2, 0, '', 'nav'),(3, NULL, 3, 'member_info', 1, 2, 0, '', 'nav'),(3, NULL, 3, 'member_index', 1, 1, 0, '', 'nav'),(3, NULL, 0, 'member', 1, 3, 0, '', 'nav'),(4, NULL, 0, 'guide', 1, 4, 0, '', 'nav'),(5, NULL, 0, 'kehu', 1, 5, 0, '', 'nav'),(6, NULL, 0, 'about', 1, 6, 0, '', 'nav'),(7, NULL, 0, 'tehui', 1, 7, 0, '', 'nav');
ログイン後にコピー
のように親IDの前にあります
私には複雑なようです〜

1ビット配列を2次元に変換?


はい、ただし、1 次元配列に cid がある場合は、cid の後ろでソートする必要があります。cid は、親ノードの添字として理解できます。ルート ノードの cid は 0~~~ です。たぶんそういう意味ですよ〜

ソートしてはいけません キーが同じ場合は自然な順序です

cid でソート可能
ID、cid 順に並べます

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート