Гэр / Интернет дээр ажиллах / Php дахь мэдээллийн сангаас мод бүтээх. PHP Ангилал (Ангиллын мод). Томми Лакруйсын бичсэн массив модны функц

Php дахь мэдээллийн сангаас мод бүтээх. PHP Ангилал (Ангиллын мод). Томми Лакруйсын бичсэн массив модны функц

Өнөөдөр би яаж хийхийг танд хэлэх болно MySQLшаталсан модыг бий болгох.

Ийм модыг динамик сайтын ангиллыг бий болгоход, жишээлбэл, онлайн дэлгүүрт эсвэл нийтлэл дээрх сэтгэгдлийг харуулахад ашигладаг.

Ер нь бол боломжтой газар л барьдаг. Хамгийн гол нь үүнийг зөв барьж, хэрэглэх явдал юм.

Шаталсан модыг бүтээхэд хамгийн чухал зүйл бол мэдээллийн сангийн зөв бүтэц юм! Жишээлбэл, сайтын категориуд хадгалагддаг мэдээллийн сангийн бүтцийг авч үзье. Учир нь энгийн жишээ, хүснэгт нь 3 талбартай байна:

  1. ID- категорийн түлхүүр
  2. эцэг эхийн дугаар- эцэг эхийн ангиллын id
  3. нэр- хэсгийн гарчиг

PHPMyAdmin дээр SQL асуулга ажиллуулж хүснэгт үүсгэцгээе:

CREATE TABLE `categories` (`id` INT NOT NULL AUTO_INCREMENT , `parent_id` INT NOT NULL , `name` VARCHAR(50) NOT NULL, PRIMARY KEY (`id`));

Одоо бид хүснэгтээ бичлэгээр дүүргэх хэрэгтэй. Үүний үр дүнд та дараах хүснэгттэй төстэй зүйлийг авах хэрэгтэй.

Та тестийн хүснэгтийг дараах асуултаар дүүргэж болно.

`Ангилал` (`id`, `эцэг эхийн_id`, `нэр`) ҮНЭ ЗҮЙН ОРУУЛАХ (1, 0, "1-р хэсэг"), (2, 0, "2-р хэсэг"), (3, 0, "3-р хэсэг" ), (4, 1, "Хэсэг 1.1"), (5, 1, "Хэсэг 1.2"), (6, 4, "Хэсэг 1.1.1"), (7, 2, "Хэсэг 2.1"), (8) , 2, "Хэсэг 2.2"), (9, 3, "Хэсэг 3.1");

Тэгээд одоо анхаарлаа хандуулаарай! Цаашилбал, логикийн хувьд та категори болон түүний дэд ангилал бүрийг сонгохын тулд өгөгдлийн сангаас гогцоонд сонголт хийх хэрэгтэй. ГЭХДЭЭ! За, хэрэв мэдээллийн санд хэд хэдэн ангилал байгаа бол энэ нь зарчмын хувьд зөв биш юм. Хэрэв сайт нь онлайн дэлгүүр бөгөөд зуун ангилалтай, ижил тооны дэд ангилалтай бол? Дараа нь асуудал! Өгөгдлийн сангийн үл мэдэгдэх тооны асуулга нь сайтыг удаашруулж эсвэл MySQL серверийг бүрэн сүйрүүлнэ.

Та бүх категори болон тэдгээрийн дэд ангиллыг сонгохын тулд мэдээллийн санд зөвхөн нэг асуулга ашиглаж болно.

Хүсэлт гаргаж, цаашдын ажилд тохиромжтой массив үүсгэцгээе.

//Өгөгдлийн сангаас өгөгдлийг сонгож байна $result=mysql_query("SELECT * FROM категори"); //Хэрэв өгөгдлийн санд бичлэг байгаа бол бид массив үүсгэдэг if (mysql_num_rows($result) > 0)( $cats = array(); // Давталт дээр бид хэсгүүдийн массив үүсгэдэг, түлхүүр нь үндсэн ангиллын id, түүнчлэн массив хэсгүүдийн түлхүүр нь категорийн id байх болно while($cat = mysql_fetch_assoc($result))( $cats_ID[$cat["id"]] = $cat; $cats[ $cat["parent_id"]][$cat["id"]] = $cat; ))

Хүснэгтээс бүх өгөгдлийг сонгох ангилалмөн ассоциатив массив үүсгэнэ $ муур, түлхүүр нь эх ангиллын id байх болно.

Одоо бид мод барих болно. Бид барилгын ажилд ашиглах болно рекурсив функц.

Шаталсан мод нь дараах бүтэцтэй байна.

  • 1-р хэсэг
    • 1.1-р хэсэг
      • 1.1.1-р хэсэг
    • 1.2-р хэсэг
  • 2-р хэсэг
    • 1.1-р хэсэг
    • 1.2-р хэсэг
  • 3-р хэсэг
    • 3.1-р хэсэг

Рекурсив функц үүсгэцгээе барих_мод() . Энэ нь бидний ямар ч үүрлэх шаталсан модыг бий болгоно.

Функц build_tree($cats,$parent_id,$ only_parent = false)( if(is_array($cats) and isset($cats[$parent_id]))( $tree = "

    "; if($only_parent==false)( foreach($cats[$parent_id] as $cat)( $tree .= ""; ))elseif(is_numeric($only_parent))( $cat = $cats[$parent_id) ][$ only_parent]; $tree .= "
  • ".$cat["нэр"]." #".$cat["id"]; $tree .= build_tree($cats,$cat["id"]); $tree .= "
  • "; ) $ мод. = "
"; ) эс бөгөөс null буцаана; $ модыг буцаана; )

Уг функц нь хэсэг хэсгүүдийн массив болон хэсгийн ID-г авдаг. Гогцоонд бид дэд категоруудаар дамждаг бөгөөд хэрэв тэдгээр нь илүү олон хэсгүүдтэй бол функцийг шинэ параметрүүдээр (хэсгүүдийн шинэ массив болон баригдах хэсгийн id) дахин ажиллуулдаг. Ямар ч үүрлэсэн мод ийм байдлаар үүсдэг!

Мод барихын тулд бид кодонд бичнэ:

echo build_tree($cats,0);

Тиймээс, хоёр алхамаар бид сайтын хэсгүүдийн шаталсан модыг үүсгэсэн бөгөөд хичнээн хэсэг байх нь хамаагүй!

UPDХэрэв танд ангиллын мод хэрэгтэй бол урвуу дараалалкатегорийн ID-г мэдэж байгаа тул та функцийг ашиглах хэрэгтэй:

find_parent функц ($tmp, $cur_id)( if($tmp[$cur_id]["parent_id"]!=0)( return find_parent($tmp,$tmp[$cur_id]["parent_id"]); ) буцах ( int)$tmp[$cur_id]["id"]; )

Энэ функц нь ангиллын массивыг авдаг бөгөөд тэдгээрийн түлхүүр нь ангиллын id болон дээш гарах ангиллын id юм.

Ийм модыг бүтээхийн тулд build_tree функцийг дараах параметрүүдээр ажиллуулна.

echo build_tree($cats,0,find_parent($cats_ID, YOUR_CATEGORY_ID));

Асуулт байна уу? Сэтгэгдэл дээр асуугаарай

Өнөөдөр бидний зорилго бол ангиллын шаталсан бүтцийг бий болгох явдал юм. Ангилал хадгалах нь тохиромжтой бөгөөд тэдгээрийг шаардлагатай газарт харуулахад хялбар байх нь бидний хувьд чухал юм.

Заримдаа энгийн зүйл нь төвөгтэй мэт санагддаг тул би танд мод хэлбэрээр php категорийг хэрэгжүүлэхэд хэрэг болно гэж найдаж буй хэд хэдэн кодын хэсэгчлэн гаргах болно.

Тиймээс бүтэц нь категорийн id (id), категорийн нэр (нэр) ба мэдээж эцэг эхийн ангиллын id (parent_id) зэргээс бүрдэх ёстой. MySQL дээр энэ нь иймэрхүү харагдаж байна:

`Ангилал` БАЙХГҮЙ БОЛ ХҮСНЭГТ ҮҮСГЭ (`id` int(10) гарын үсэг зураагүй NULL АВТО_НЭМЭЛТ, `name` varchar(255) NULL БИШ, `parent_id` int(11) NULL БИШ, АНХАН ТҮЛХҮҮР (`id`)) ХӨДӨЛМӨР =InnoDB өгөгдмөл CHARSET=utf8 AUTO_INCREMENT=0 ;

Ангилал хадгалах хамгийн бага бөгөөд ойлгомжтой хүснэгтийн бүтэц.

`Ангилал` (`id`, `нэр`, `эцэг эхийн_id`) ҮНЭ ЗҮЙН ОРУУЛАХ (1, "Утас ба таблет", "0"), (2, "Машин", "0"), (3, "Samsung" ", "1"), (4, "Apple", "1"), (5, "LG", "1"), (6, "Форд", "2"), (7, "Lexus", "2"), (8, "BMW", "2"), (9, " Galaxy Tab 4", "3"), (10, "Galaxy S6", "3");

parent_id=0 бол энэ ангилалд эцэг эх ангилал байхгүй.

Энд бүх зүйл ойлгомжтой бөгөөд энгийн байдаг. Одоо ангиллыг жагсаах руу шилжье. Гэхдээ жагсаалтыг зөв гаргахын тулд бид эхлээд php ангиллын жагсаалтыг бүхэлд нь авах хэрэгтэй бөгөөд зөвхөн дараа нь рекурсийг ашиглан модыг бий болгоно. Дараагийн функцЭнэ жагсаалтыг авах нь:

Функц get_cat() ( // өгөгдлийн сангаас асуух $sql = "СОНГОХ * категороос"; $үр дүн = mysql_query($sql); if(!$үр дүн) ( NULL буцаана; ) $arr_cat = массив(); if( mysql_num_rows ($үр дүн) != 0) ( //For($i = 0; $i< mysql_num_rows($result);$i++) { $row = mysql_fetch_array($result,MYSQL_ASSOC); //Формируем массив, где ключами являются адишники на родительские категории if(empty($arr_cat[$row["parent_id"]])) { $arr_cat[$row["parent_id"]] = array(); } $arr_cat[$row["parent_id"]] = $row; } //возвращаем массив return $arr_cat; } }

//каталогийн массивыг авах $үр дүн = get_cat();

Одоо бидэнд рекурс бүхий функц хэрэгтэй байна

Функц view_cat($arr,$parent_id = 0) ( //Recursion гарах нөхцөл if(empty($arr[$parent_id])) ( return; ) echo "

    "; // массиваар гүйлгэж, for($i = 0; $i) харуулах< count($arr[$parent_id]);$i++) { echo "
  • " .$arr[$parent_id][$i]["name"].""; //recursion - хүүхдийн ангилал байгаа эсэхийг шалгах view_cat($arr,$arr[$parent_id][$i]["id "] ); цуурай "
  • "; ) цуурай "
"; }

Одоо зөвхөн рекурсив функцийг ашиглан лавлахыг дэлгэцэн дээр харуулахад л үлддэг

Харах_муур($үр дүн);

Тэгээд ерөнхийдөө энэ л байна. Ингэснээр бид хязгааргүй дэд категори бүхий категорийн бүрэн модыг авах боломжтой.

Тиймээс, эхлээд бид юутай ажиллах, юу хэрэгтэй болохыг тайлбарлах болно.
Систем: PHP 5 ба түүнээс дээш, mySQL 4 ба түүнээс дээш
Туслах ангиуд: dbsql.class.php (өгөгдлийн сангийн анги)
Оруулсан ангиллын анги: classTreeCategory.php (шууд үндсэн анги, түүний жагсаалт, тайлбарыг доор өгөв.

Өгөгдлийн санд дараах бүтэцтэй хүснэгт үүсгэ.

MySQL кодыг үзэж байна

Энэ хүснэгтэд талбар байгаа ID- ангиллын серийн дугаар, podcat- эхний эрэмбийн категори эсвэл үндсэн ангиллын ID-ийн хувьд тэг утгатай байх; нэр- ангиллын нэр.

Ангиудыг дэд категори бүхий жагсаалт болгон харуулах ангийн жишээ:

PHP кодыг харах

оруулах("dbsql.class.php"); include("classTreeCategory.php" ); $DB = new DB_Engine("mysql" , $settings [ "dbHost" ] , $settings [ "dbUser" ] , $settings [ "dbPass" ] , $settings ["dbName" ] ); // мэдээллийн санд холбогдож, хандалтын өгөгдлийг зааж өгнө$category = шинэ TreeCategory ($DB ); // мэдээллийн сантай ажиллах объект болох категорийн анги руу шилжих$category -> table = "category" ; // категори бүхий мэдээллийн сан дахь хүснэгтийн нэр$ массив = $ категори -> getCategory() ; // мэдээллийн сангаас бүх категорийг олон түвшний массив хэлбэрээр авах, бидэнд хэрэгтэй дарааллаар эрэмбэлж, үүрлэх$category -> outCategory ($массив , "сонголт" ); // категорийн гаралтыг бэлтгэх (HTML үүсгэх), категори бүхий массив дамжуулах echo $ категори -> html ; // HTML хэлбэрээр ангиллыг гаргана

Дээрх жишээнээс харахад бүх зүйл маш энгийн бөгөөд бид шинэ $category объект үүсгэж, ямар өгөгдлийн сангийн хүснэгттэй ажиллахыг тохируулна: 'category', дараа нь бид хүснэгтээс массив хэлбэрээр форматлагдсан бүх категорийн жагсаалтыг авна. бүх дэд ангиллыг харгалзан шаталсан дарааллаар задалсан. Дараа нь бид массивыг outCategory() арга руу дамжуулдаг бөгөөд энэ нь бидэнд зориулж бэлэн HTML кодыг үүсгэдэг бөгөөд энэ нь зөвхөн хөтөч дээр харагдах болно.

Бидний харж байгаагаар outCategory() арга нь @array ба @string гэсэн хоёр параметрийг эхний параметрт бүх категори бүхий массив, хоёрдугаарт утга агуулсан мөрийг авдаг. сонголтэсвэл ширээ, энэ утга нь ямар төрлийн HTML код үүсгэхийг заадаг.
Утга сонголт

HTML кодыг харах

Аливаа маягтын сонгох талбарт өгөгдсөн HTML кодыг оруулах.

Утга ширээ- дараах HTML кодыг үүсгэнэ:

HTML кодыг харах

Энэ HTML код нь манай бүх дэд категориудыг харуулсан хүснэгтэд буулгахад тохиромжтой.

Анги нь дараахь аргуудтай.
устгах зүйл($id);- үүрлэсэн ангиллаас үл хамааран нэг ангиллыг хасна
delCategory($массив, $id);— бүх дэд категори бүхий категорийг устгана, $array — $category->getCategory() аргаар бэлтгэсэн бүх категори бүхий массив, $ ID дугаарустгах ангилал
addItem();- Хэрэв та категори нэмэхийг хүсвэл энэ аргыг дуудах хэрэгтэй бөгөөд энэ арга нь POST аргаар дамжуулсан өгөгдлөөс утгыг уншдаг, өөрөөр хэлбэл. $_POST массиваас.
$name=$this->PHP_slashes(srip_tags($_POST['name'])); // категорийн нэр
$podcat=intval($_POST['podcat']); // Үндсэн категорийн ID, хэрэв 0 гэж заасан бол категори нь үндэс дээр байх болно.
updateItem(); - өмнөх аргатай төстэй, зөвхөн энэ арга нь ангилал, нэр, үүрлэх түвшинг шинэчилдэг.

хүснэгт = "Ангилал"; // категорийн жагсаалтыг сонгох хүсэлт, хүснэгтийн нэр * $category->outCategory($category->getCategory()); // категорийн гаралтыг бэлтгэх (категорийн массив хүсэлт) * echo $category->html; // HTML нэрээр категориудыг харуулах * */ /** * Ажиллаж буй хүснэгтийг хаях * * `Ангилал` БАЙДАГ БОЛ ХҮСНЭГТИЙГ DROP; * CREATE TABLE `category` (* `id` int(11) NULL БИШ auto_increment, * `podcat` int(11) NULL БИШ, * `name` varchar(255) NULL БИШ, * АНХАН ТҮЛХҮҮР (`id`), * KEY `id` (`id`) *) ENGINE=MyISAM-н өгөгдмөл CHARSE=utf8; * */ анги TreeCategory ( /** * Өгөгдлийн сангийн асуулгын мөр */ var $хүснэгт; /** * Өгөгдлийн сангийн интерфейс */ var $DB; /** * Оруулсан дэд категори бүхий категорийн массив */ var $arrayCat; / ** * */ var $countPodcat-г харуулах үед категорийн нэрний өмнөх зураасны тоог автоматаар тоолно; /** * Дэд категори бүхий категорийг харуулах HTML код */ var $html; /** * Өгөгдлийн сантай ажиллах интерфэйс болон локал хувьсагч руу оруулах */ функц __construct($DB) ( $this->DB=$DB; $this->component=$_GET["component"]; ) /** * Ангилал, эрэмбэлэх жагсаалтыг авна. мөн үүрлэсэн массив гэх мэт массив руу оруулдаг. * @return массив ангилал */ функц getCategory () ( $all = $this->DB->getAll("SELECT * FROM `($this->хүснэгт)` ЗАХИАЛАХ `id` ASC"); $path = массив(); if(count($бүгд)>0) (foreach($бүгдийг $ зүйлээр): if($item["podcat"]==0)$сорт[ $item[ "id"]]=$item; if($item["podcat"]>0) ( if(isset($path[$item["podcat"]])) ( $str="$sort" ; foreach( $path[$item["podcat"]] $pitem хэлбэрээр): $rep =$зүйл["podcat"]; $str.="[$pitem]"; endforeach; $str.="[($item["podcat"])]"; $str.="[($item["id"])]"; $str.="=$item;"; үнэлэх($str); foreach($path[$item["podcat"]] нь $pitem): $path[$item["id"]]=$pitem; endforeach; $path[$item["id"]]=$зүйл["podcat"]; ) else ( $sort[$item["podcat"]]["sub"][$item["id"]]=$item; $path[$item["id"]]=$item["podcat" ]; ) ) endforeach; ) $this->arrayCat=$sort; $this->arrayCat буцаана; ) /** * Ангилалуудыг хэвлэж, дууссан HTML-г $this->html-д оруулна * @param массив Ангилал ба үүрлэсэн дэд категори бүхий массив * @param string Гаралт, сонголт эсвэл хүснэгтэд үүсгэсэн HTML кодын төрөл */ функц outCategory(& $arrayCat, $type="option", $idSel=0) ( foreach($arrayCat гэж $sub) ( $this->countPodcat++; $this->outItem($sub, $type); if(!empty($) sub[" sub"]))$this->outCategory($sub["sub"], $type, $idSel); $this->countPodcat--; ) ) ) /** * HTML код бэлтгэх туслах арга * @param массив категори бүхий массив * @param string Гаралт, сонголт эсвэл хүснэгтэд үүсгэх үүсгэсэн HTML кодын төрөл */ функц outItem($sub, $type="option", $idSel=0) ( for($i=0;$) icountPodcat;$i++) ($out. = "-"; ) if($idSel==$sub["id"])$se="сонгосон"; өөрөөр $se=""; if($type=="option")$this->html.=" ($out) ($sub["нэр"]) "; if($type=="хүснэгт")$this->html.= ($out) ($sub["нэр"]) HTML; ) функц delCategory(&$a_tree,&$id=0) ( foreach($a_tree нь $sub) ( if($sub["id"]$id болон isset($sub["sub"]))$this- >delCategory($sub["sub"],$id); if($sub["id"]==$id) ( $sql="DELETE FROM ($this->хүснэгт) WHERE id = "$id" ХЯЗГААР 1"; $this->DB->execute($sql); if (isset($sub["sub"])) $this->delCategory_process($sub["sub"]); ) ) ) функц delCategory_process (&$a_tree) ( foreach($a_tree as $sub) ( $sql="DELETE FROM ($this->хүснэгт) WHERE id = "($sub["id"])" LIMIT 1"; $this-> DB->execute($sql); if(isset($sub["sub"]))$this->delCategory_process($sub["sub"]); ) ) функц updateItem() ( $name=$ this- >PHP_slashes(strip_tags($_POST["name"])); $podcat=intval($_POST["podcat"]); $id=intval($_POST["id"]); $sql="UPDATE `( $this->хүснэгт)` SET `name` = "($name)",`podcat` = "($podcat)" WHERE `id`="($id)" LIMIT 1; "; $this->DB ->execute($sql); ) function addItem() ($name=$this->PHP_slashes(strip_tags($_POST["name"])); $podcat=intval($_POST["podcat"]); $ id=intval($_POST["id"]); $sql="I NSERT INTO `($this->хүснэгт)` (`id`,`podcat`,`name`) VALUES ("", "$podcat", "$name");"; $this->DB->execute($sql); ) функц устгахItem($id) ( $id=intval($id); $sql = `($this->хүснэгт)` WHERE `id` = "($id)" ХЯЗГААР 1-ээс УСТГАХ; $DB- >execute($sql); header("Байршил:?component=($this->component)"); ) функц PHP_slashes($string,$type="add") (хэрэв ($type == "add") ( if (get_magic_quotes_gpc()) ( буцаах $string; ) else ( if (function_exists("addslashes")) ( return addslashes($string); ) else ( return mysql_real_escape_string($string); ) ) ) else if ($type) == "зураас") ( туузан зураасыг буцаана($string); ) else ( "PHP_slashes дахь алдаа (холимог, нэмэх | зурвас)"); ) ) )

Анги бүхэлдээ нэг цагийн дотор бичигдсэн бөгөөд мэдээжийн хэрэг алдаа дутагдалтай боловч энэ бүгдийг засах боломжтой. Үүнийг боловсролын зорилгоор ашиглахыг зөвлөж байна, гэхдээ дашрамд хэлэхэд, үүнийг бага зэрэг дуусгасны дараа та үүнийг ямар ч системд суулгаж, ажлыг нь эдлэх боломжтой)).

Сэтгэгдэл бичихдээ та энэ асуудлыг шийдэх өөрийн сонголтуудыг санал болгож байвал хязгааргүй үүрлэх түвшний категориудыг зохион байгуулбал би талархах болно.

Нэг ч сайт нь навигацигүйгээр бүрэн дүүрэн байдаггүй, эсвэл "сайт цэс" гэж нэрлэдэг. Тиймээс сайтын цэс нь модны хэлбэрээр нэг түвшний, олон түвшний байж болно. Хэрэв нэг түвшний цэсийг хэрэгжүүлэхэд тодорхой бэрхшээл гарахгүй бол үүсгэх үед олон түвшний цэссайн бодох хэрэгтэй.

Энэ даалгаварт хамгийн чухал зүйл бол манай олон түвшний цэсэнд зориулсан мэдээллийн санг зохиох явдал юм. Гурван талбар бүхий Categories хүснэгтийг үүсгэцгээе ID, гарчиг, эцэг эххаана:

  • ID- танигч
  • Гарчиг- Цэсийн нэр
  • эцэг эх- Үндсэн ангилалын эцэг эх 0

Талбар нь цэсийг салбарлах үүрэгтэй эцэг эххэрэв эцэг эх = 0, тэгвэл энэ ангилал нь эх ангилал болно. Эцэг эхийн ангилалд хүүхдүүдийг нэмэхийн тулд эцэг эхийн талбарт зааж өгөх шаардлагатай IDхүссэн эцэг эх. Жишээлбэл:

Ангилал бүхий хүснэгтүүд

Хүснэгтээс харахад эцэг эхийн ангилал Машинуудхоёр үр удам бий Маздаболон Хондасалбараар холбоотой эцэг эх. Мөн ангилал Мотоциклхоёр үр төл байна кавасакиболон Харли. Үүний зэрэгцээ завь ангилалд үр удам байхгүй. Та категорийг хэрхэн холбохыг ойлгосон гэж найдаж байна.

Дараа нь бид үг хэллэгээс дасгал руу шилждэг. Ангилалуудын хүснэгтийг үүсгэцгээе.

"Ангилал" БАЙХГҮЙ БОЛ ХҮСНЭГТ ҮҮСГЭ (`id` int(10) тэмдэггүй NULL БУС AUTO_INCREMENT, `title` varchar(255) NULL БИШ, `parent` int(10) тэмдэггүй NULL БИШ, АНХАН ТҮЛХҮҮР (`id`)) ENGINE=MyISAM-н өгөгдмөл CHARET=utf8 AUTO_INCREMENT=20 ; -- -- `Ангилал` хүснэгтийн өгөгдлийг хаях -- `Ангилал` (`id`, `гарчиг`, `эцэг эх`) INSERT INTO VALUES (1, "Машин", 0), (2, "Мотоцикл", 0) , (3, Mazda, 1), (4, Honda, 1), (5, Kawasaki, 2), (6, Harley, 2), (7, Mazda 3, 3), (8, "Mazda 6", 3), (9, "Седан", 7), (10, "Хэтчбек", 7), (11, "Завь", 0), (12, "Лифтбек", 8), (13, "Кроссовер", 8), (14, "Цагаан", 13), (15, "Улаан", 13), (16, "Хар", 13), (17, "Ногоон", 13), (18, Mazda CX, 3) ), (19, Mazda MX, 3);

Ажлын алгоритм нь дараахь зүйлээс бүрдэнэ.

Өгөгдлийн сангийн холболт үүсгэх

query("SET NAMES "utf8""); /* * Энэ бол үүнийг хийх "албан ёсны" объект хандалтат арга юм * гэхдээ $connect_error нь PHP 5.2.9 болон 5.3.0 хүртэл ажиллаагүй. */ if ($mysqli->connect_error) ( die("Холболт амжилтгүй болсон (" . $mysqli->connect_errno. ") " . $mysqli->connect_error; ) /* * Хэрэв та хувилбаруудтай нийцэж байгаа эсэхийг шалгахыг хүсвэл 5.2 .9-ээс өмнө * ийм код илүү сайн */ if (mysqli_connect_error()) ( die("Холболт амжилтгүй болсон (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); )

Ангилал хүснэгтээс өгөгдөл авах функц бичих

//Өгөгдлийн сангаас манай цэсийн массивыг массив функцээр авна getCat($mysqli)( $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); //Массив үүсгэнэ үү. массивын түлхүүр нь цэсийн ID $cat = array(); while($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) буцаана $cat; )

Бид иймэрхүү массивыг авдаг бөгөөд массивын түлхүүр нь категорийн ID юм.

Томми Лакруйсын бичсэн массив модны функц

//Tommy Lacroix-ийн массиваас мод бүтээх функц getTree($dataset) ( $tree = array(); foreach ($id => &$зангилаа) ( //Хэрэв хавсралт байхгүй бол (!$node[" parent"])( $tree[$id] = &$node; )else( //Хэрэв хүүхдүүд байгаа бол $dataset[$node["parent"]][" массиваар давталт хийнэ үү. childs"][$id] = &$ зангилаа; ) ) $tree; ) буцаана.

Мод хэлбэрээр массив авах

Бүхэл бүтэн скрипт

query("SET NAMES "utf8""); /* * Энэ бол үүнийг хийх "албан ёсны" объект хандалтат арга юм * гэхдээ $connect_error нь PHP 5.2.9 болон 5.3.0 хүртэл ажиллаагүй. */ if ($mysqli->connect_error) ( die("Холболт амжилтгүй болсон (" . $mysqli->connect_errno. ") " . $mysqli->connect_error; ) /* * Хэрэв та хувилбаруудтай нийцэж байгаа эсэхийг шалгахыг хүсвэл 5.2 .9-ээс өмнө * энэ кодыг ашиглах нь илүү дээр юм */ if (mysqli_connect_error()) ( die("Холболтын алдаа (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); ) //Манай цэсийн массивыг авах өгөгдлийн сангаас массив функцээр авах getCat($mysqli)( $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); //Масивын түлхүүр нь цэс болох массив үүсгэ. ID $cat = array(); while ($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) буцаах $cat; ) //Мод барих функц Tommy Lacroix функцийн массиваас getTree($dataset) ( $tree = array(); foreach ($id => &$ зангилаа) ( //Хэрэв хавсралт байхгүй бол (!$ зангилаа["эцэг эх" ])( $tree[$id] = &$node; )else( //Хэрэв хүүхдүүд байгаа бол $dataset[$node["parent"]]["childs"][$id] массиваар давтана уу. &$зангилаа; ) ) $tree; буцаана; ) //Бэлтгэлтэй бай $cat = getCat($mysqli) бүхий th массив; //Модны цэс үүсгэх $tree = getTree($cat); //Цэсийг модны функц хэлбэрээр харуулах загвар tplMenu($category)( $menu = "
  • ".$категори["гарчиг"].""; if(isset($category["хүүхдүүд"]))( $цэс .= "
      ".showCat($category["хүүхдүүд"]) ."
    "; ) $ цэс. = "
  • "; return $menu; ) /** * Манай загварыг рекурсив байдлаар уншина уу **/ function showCat($data)( $string = ""; foreach($data as $item)( $string .= tplMenu($item); ) буцаах $string; ) //HTML тэмдэглэгээ авах $cat_menu = showCat($tree); //Цуурайг харуулах "
      ". $cat_menu ."
    "; ?>

    Ажлын үр дүн

    Админд зориулсан PHP + MySQL дээрх олон түвшний цэс

    Хэрэв та ашиглахыг хүсвэл энэ цэссайтынхаа админ самбар дээр та хэд хэдэн функцийг дахин бичих хэрэгтэй tplMenu(), showCat().

    ".$ категори["гарчиг"].""; ) else( $ цэс = " "; ) if(isset($category["childs"]))( $i = 1; for($j = 0; $j)< $i; $j++){ $str .= "→"; } $i++; $menu .= showCat($category["childs"], $str); } return $menu; } /** * Рекурсивно считываем наш шаблон **/ function showCat($data, $str){ $string = ""; $str = $str; foreach($data as $item){ $string .= tplMenu($item, $str); } return $string; } //Получаем HTML разметку $cat_menu = showCat($tree, ""); //Выводим на экран echo ""; ?>

    Ажлын үр дүн

    Машинууд → Mazda →→ Mazda 3 →→→ Седан →→→ Хэтчбек →→ Mazda 6 →→→ Лифтбек →→→ Кроссовер →→→→ Цагаан →→→ Улаан →→→→ Хар →→→→Ногоон →→ Mazda CX → → Mazda MX → Хонда мотоцикл → Kawasaki → Harley Boats

    Дараагийн ажил бол PHP ашиглан хязгааргүй үүрлэх категориудыг гаргах явдал юм. Хэд хэдэн сайт руу авирч, би олон шийдлийг олсон боловч бүгдийг нь ойлгох боломжгүй, учир нь. тэнд програмчлалын түвшин минийхээс өндөр. Тиймээс, би хамгийн энгийн, магадгүй хамгийн гоёмсог биш, гэхдээ ажиллах шийдлийг олсон.

    Эхлээд мэдээллийн санд юу байгааг харцгаая

    • id - манай ангиллын танигч
    • категори — ангиллын нэр
    • category_id - эцэг эхийн ангиллын ID. parent_id руу залгах боломжтой байсан ч энэ нь надад илүү танил юм
    • lvl — ангиллын үүрлэх түвшин. бүрдүүлэх шаардлагатай
    • Түрхсэн бүхэн чамд ямар ч хэрэггүй, учир нь Би хувьдаа надад хэрэгтэй мэдээлэл байгаа бөгөөд таныг төөрөгдүүлэхгүйн тулд би энэ шаардлагагүй мэдээллийг устгасан.

    ангилалд харуулж байна "; ?>

    Энд хэлэх онцгой зүйл байхгүй, хэрэв танд асуулт байвал сэтгэгдэл дээр бичээрэй, энд бичсэн зүйл огт хамаагүй хүмүүст би үр дүнг шууд харахыг зөвлөж байна.

    Хэрэв та ойлгохгүй байгаа бол категориудын нэрний өмнө хэр их "-" оруулахыг мэдэхийн тулд мэдээллийн санд lvl талбар хэрэгтэй болно. Мэдээжийн хэрэг, lvlгүйгээр илүү боловсронгуй арга байдаг, гэхдээ дээр Энэ мөчНадад ганц л шийдэл байна. Энэ нь өөрчлөгдөхийн хэрээр би нийтлэлийг шинэчлэх болно.

    ангилалд харуулж байна

    Үүнийг маягтаар биш, харин жагсаалтаар харуулах шаардлагатай үед танд зориулсан өөр нэг шийдэл энд байна.

    "; while($rows = mysql_fetch_assoc($res))( $out .= "

  • ".$rows["category"]."
  • "; foo($rows["id"]); ) $out .= ""; буцаах $out; ) echo foo(0); ?>

    Энд бидэнд lvl хэрэггүй болсон тул код бага байна. Тэгээд үр дүн нь доор байна