我正在尝试创建层次结构/树中所有类别的二维数组。
所以父类别先出现,然后是它的子类别,然后是第 3 级类别,然后是第 4 级类别。
我有一个表有这样的记录
cc_id category_name parent_id level
1 general 0 1
2 Books 1 2
3 Magazines 1 2
4 English Book 2 3
5 Love Story 4 4
我想要这样的输出
Array
(
[0] => Array
(
[cc_id] => 1
[parent_id] => 0
[category_name] => General
[level] => 1
)
[1] => Array
(
[cc_id] => 2
[parent_id] => 1
[category_name] => Books
[level] => 2
)
[2] => Array
(
[cc_id] => 4
[parent_id] => 2
[category_name] => English Book
[level] => 3
)
[3] => Array
(
[cc_id] => 4
[parent_id] => 3
[category_name] => Love Story
[level] => 4
)
[4] => Array
(
[cc_id] => 3
[parent_id] => 1
[category_name] => Magazine
[level] => 2
)
)
如果我可以在同一页面上混合 html 和 php 代码,我可以实现这一点。但是我使用的是 MVC 结构,所以这是我的要求,我按嵌套顺序创建一个数组。因为我不能在我的内部使用 if else 条件查看页面。
我在我的 Controller /lib 文件中尝试的是
$result = $DB->query("SELECT *
FROM " . DB_PREFIX . "classified_categoies
WHERE is_publish=1");
//------------------------------------------------
// Check if resultset contains any rows
//------------------------------------------------
if ($DB->num_rows($result))
{
$i = 0;
//------------------------------------------------
// Fetch resultset
//------------------------------------------------
while( $obj = $DB->fetch_object($result) )
{
//------------------------------------------------
// Set values
//------------------------------------------------
if($obj->parent_id==0 and $obj->level==1)
{
$entries_obj[$i]['category_id'] = $obj->cc_id;
$entries_obj[$i]['parent_id'] = $obj->parent_id;
$entries_obj[$i]['category_name'] = $obj->category_name;
$entries_obj[$i]['level'] = $obj->level;
$i++;
}
$result2 = $DB->query("SELECT *
FROM " . DB_PREFIX . "classified_categoies
WHERE is_publish=1 AND parent_id=".$obj->cc_id." order by level asc");
if ($DB->num_rows($result))
{
while( $obj2 = $DB->fetch_object($result2) )
{
if($obj->level==2)
{
$entries_obj[$i]['category_id'] = $obj2->cc_id;
$entries_obj[$i]['parent_id'] = $obj2->parent_id;
$entries_obj[$i]['category_name'] = $obj2->category_name;
$entries_obj[$i]['level'] = $obj2->level;
$i++;
}
}
}
}
但通过这样做,我最多可以得到 2 级类别。似乎通过使用上面的逻辑我必须编写 4 个查询。有没有任何有效的方法你们可以建议请。谢谢..
一般输出应该是这样的
Genaral
Books
English books
Love Story
Magazines
但我想要二维数组中的输出。
最佳答案
一个递归的方法会做...
// First get a simple array of recordset, not as efficient but serves our purpose, so avoid filtering by level...
$baseArray = array();
while( $obj = $DB->fetch_object($result) )
{
$baseArray[$obj->cc_id] = new array('category_id' => $obj->cc_id,
'category_name' => $obj->category_name,
'parent_id' => $obj->parent_id,
'level' => $obj->level);
}
// Now our recursive method
function getBookCategories($inputArray, $parent = 0, $level = 0){
$tmpReturn = array();
foreach($inputArray as $cc_id => $categoryArray){
if($categoryArray['parent_id'] == $parent){
$tmpReturn[$cc_id] = $categoryArray;
if($level < 4){
$tmpReturn[$cc_id]['children'] = array();
$tmpReturn[$cc_id]['children'] = getBookCategories($inputArray, $cc_id, $level + 1);
}
}
}
return $tmpReturn;
}
编辑
如果您希望它与 $baseArray 相同,则:
function getBookCategories2($inputArray, &$outputArray, $parent = 0, $level = 0){
foreach($inputArray as $cc_id => $categoryArray){
if($categoryArray['parent_id'] == $parent){
$outputArray[] = $categoryArray;
if($level < 4){
getBookCategories2($inputArray, $outputArray, $cc_id, $level + 1);
}
}
}
}
$desiredArray = array();
getBookCategories2($baseArray, $desiredArray, 0, 0);
关于php - 我如何在最多 4 个级别的树中选择类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28053770/