从PHP中的多级数组中获取唯一的子ID

时间:2016-05-10 10:01:16

标签: php recursion

我有多级别类别数组。 如果父母没有孩子,我只想得到孩子的身份证。然后返回该父ID

id   parent_id    name
1      0          fashion
2      1          women
3      1          men
4      2          jeans
5      2          skirts
6      5          short skirts
7      5          long skirts
8      0          Home & entertainment

我尝试了这个功能。

function buildtree($src_arr, $parent_id = 0, $tree = array()){
       foreach($src_arr as $idx => $row){
           if($row['parent_id'] == $parent_id){
               foreach($row as $k => $v)
                   $tree[$row['id']][$k] = $v;
               unset($src_arr[$idx]);
               $tree[$row['id']]['children'] = self::buildtree($src_arr, $row['id']);
           }
       }
       ksort($tree);
       return $tree;
   }

但它也给了我所有父母的身份。

带有id的期望结果(我输入名称以便于理解)

array(
 [0]  = men 
 [1]  = jeans
 [2]  = short skirts
 [3]  = long skirts
 [4]  = home & entertainment 
)

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

带有where逻辑的简单not in子句将帮助您选择孩子,然后选择没有孩子的父母。

select c.id, c.name
from categories c
where c.id not in (select parent_id from categories order by id desc)

其中包含

的结果集
+----+----------------------+
| id | name                 |
+----+----------------------+
|  3 | men                  |
|  4 | jeans                |
|  6 | long skirts          |
|  7 | short skirts         |
|  8 | home & entertainment |
+----+----------------------+
5 rows in set

See SQL Fiddle

答案 1 :(得分:0)

在PHP中完成后,您可以使用此函数,该函数为您提供基于给定parent_id的所有边缘子项的平面数组。如果要检查整个数据库表,则sql-only是更好的选择。

function getchildren($src_arr, $parent_id = 0) 
{ 
    $allchildren = array();

    foreach($src_arr as $idx => $row){ 
        if($row['parent_id'] == $parent_id){ 
            $children = static::getchildren($src_arr, $row['id']);
            if ($children) { 
                $allchildren = array_merge($allchildren, $children);                 
            } else { 
                $allchildren[] = $row;
            } 
        } 
    } 

    return $allchildren;
}