![](/img/trans.png)
[英]Display the sub-subcategories of the current subcategories in Woocommerce
[英]How to display categories, subcategories, sub-subcategories in select list - php/mysql?
我想在選擇列表(下拉列表)中顯示類別,子類別和子子類別,就像WordPress在其管理面板中顯示的方式一樣。 首先看看我的數據庫表(tb_categories) -
我想要HTML格式的以下輸出 -
“無”和“未分類”這兩個項目在代碼中是硬編碼的。 我想知道如何使用選擇列表選項按層次順序顯示類別及其子類別。
我正在嘗試使用以下sql查詢,其中我使用自聯接。 這里是 -
SELECT
`cat`.`category_name` AS 'category name',
`cat2`.`category_name` AS 'parent category'
FROM
`tb_categories` AS `cat`
LEFT JOIN `tb_categories` AS `cat2` ON `cat`.`category_parent` = `cat2`.`category_id`
ORDER BY
'parent category'
它給出的輸出是 -
Array
(
[0] => Array
(
[0] => My Parent Category
[category name] => My Parent Category
[1] =>
[parent category] =>
)
[1] => Array
(
[0] => Parent Category 2
[category name] => Parent Category 2
[1] =>
[parent category] =>
)
[2] => Array
(
[0] => Parent Category 3
[category name] => Parent Category 3
[1] =>
[parent category] =>
)
[3] => Array
(
[0] => My Child Category
[category name] => My Child Category
[1] => My Parent Category
[parent category] => My Parent Category
)
[4] => Array
(
[0] => Sports
[category name] => Sports
[1] =>
[parent category] =>
)
[5] => Array
(
[0] => Cricket is best
[category name] => Cricket is best
[1] => Sports
[parent category] => Sports
)
[6] => Array
(
[0] => AJAX
[category name] => AJAX
[1] =>
[parent category] =>
)
[7] => Array
(
[0] => hockey is best
[category name] => hockey is best
[1] => Sports
[parent category] => Sports
)
)
我不知道甚至不確定如何在該選擇列表中顯示上述數據。 我們怎么做? 我們怎樣才能使用連接呢? 如果我們使用連接,那么我們是否需要一些數組來存儲和排序結果? 還有我們如何在循環中使用多個查詢來做到這一點? 哪種方法最好?
假設您的給定數組在$ array中,您可以使用它。 但正如我告訴你的那樣,你應該選擇id來處理具有相同名稱的類別,並將它們用作選擇框中的選項值:
$options = get_options($array);
echo "<select>";
foreach($options as $val) {
echo "<option>".$val."</option>";
}
echo "</select>";
function get_options($array, $parent="", $indent="") {
$return = array();
foreach($array as $key => $val) {
if($val["parent category"] == $parent) {
$return[] = $indent.$val["category name"];
$return = array_merge($return, get_options($array, $val["category name"], $indent." "));
}
}
return $return;
}
假設您現在將數組中的ID設置為“category_id”和“parent_category_id”,則可以使用此選項。 在$ return中鍵之前的“x”只是為了避免php更改你的鍵,因為它們是數字的。
$options = get_options($array);
echo "<select>";
foreach($options as $key => $val) {
echo "<option value='".substr($key,1)."'>".$val."</option>";
}
echo "</select>";
function get_options($array, $parent=0, $indent="") {
$return = array();
foreach($array as $key => $val) {
if($val["parent_category_id"] == $parent) {
$return["x".$val["category_id"]] = $indent.$val["category name"];
$return = array_merge($return, get_options($array, $val["category_id"], $indent." "));
}
}
return $return;
}
這是最簡單的類別表結構
+-------------------------+
| categories |
+-------------------------+
| category_id (int) | PK
| parent_id (int) | Index
| category_name (varchar) |
| ... |
+-------------------------+
下面的函數將遞歸地獲取所有類別並構建層次結構。 如您所見,您可以選擇要預先選擇的值,也可以僅獲取更改父級值的層次結構的一部分。
function build_category_tree(&$output, $preselected, $parent=0, $indent=""){
$r = mysql_query("
SELECT category_id, category_name FROM categories WHERE parent_id = " . $parent . "
");
while($c = mysql_fetch_array($r, MYSQL_ASSOC)){
$selected = ($c["category_id"] == $preselected) ? "selected=\"selected\"" : "";
$output .= "<option value=\"" . $c["category_id"] . "\" " . $selected . ">" . $indent . $c["category_name"] . "</option>";
if($c["category_id"] != $parent){
build_category_tree($output, $preselected, $c["category_id"], $indent . " ");
}
}
}
用法:
<?php
build_category_tree($categories, 0);
// if you want to preselect a value and start from some subcategory
build_category_tree($categories, 5, 2);
?>
<!-- HTML -->
<select><?php echo $categories ?></select>
<!-- if you want to add some extra options -->
<select>
<option value="-1">Choose a category</option>
<?php echo $categories ?>
</select>
附注:雖然此功能看起來很優雅,但如果您有數千個類別,請不要使用它。 此外,在最終版本中使用MySQLi或PDO_MySQL擴展。
$con = mysqli_connect("localhost","root","","categories");
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$sql = mysqli_query($con,"SELECT `cat`.`categoryName` AS 'category name', `cat2`.`categoryName` AS 'parent category' FROM `product_category` AS `cat` LEFT JOIN `product_category` AS `cat2` ON `cat`.`parentId` = `cat2`.`categoryId` where `cat2`.`categoryName` !='NULL' order by `cat2`.`categoryName`");
while($res=mysqli_fetch_array($sql,MYSQLI_ASSOC)){
$cat[] = $res['category name'];
$parent[]= $res['parent category'];
}
$parents = "";
for($i=0;$i<count($cat);$i++){
if($parents!=$parent[$i]){
if($i!=0){ echo "</ul>"; }
echo $parent[$i]."<ul><li>".$cat[$i]."</li>" ;
}else{
echo "<li>".$cat[$i]."</li>" ;
}
$parents = $parent[$i];
}
echo "</ul>";
表格更多有關php,ajax,jquery,mysql,面試問題的教程。 請看我的博客hackandphp.com
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.