如何从子ID获取父ID?

时间:2018-01-12 07:59:59

标签: php arrays

我的数据库结构看起来像

id|parent_id|category_name|
1 |   0     |Vehicle
2 |   0     |Tv
3 |   0     |Phone
4 |   1     |Bmw X Series
5 |   2     |Led Tv
6 |   2     |Plazma Tv
7 |   3     |Samsung
8 |   3     |Iphone
9 |   4     |Bmw X7

如果我们假设我们知道子类别,我们如何才能找到最高类别。 例如: 当parent_id = 2时

我如何创建以下输出或衍生物

电视>带领电视

当parent_id = 4时

车辆> Bmw X系列>宝马X7

我的代码:

function get_key($arr, $id)
        {
            foreach ($arr as $key => $val) {
                if ($val['id'] === $id) {
                    return $key;
                }
            }
            return null;
        }

        function get_parent($arr, $id)
        {
            $key = get_key($arr, $id);
            if ($arr[$key]['parent_id'] == 0)
            {
                return $id;
            }
            else
            {
                return get_parent($arr, $arr[$key]['parent_id']);
            }
        }

2 个答案:

答案 0 :(得分:1)

你根本不需要递归。第一个函数 - get_key - 很好。但是你需要改变的第二个。你应该用id来改变逻辑。如果您在start id下有一些子类别,则结果将是未定义的。您可以从根目录创建路径到类别,然后设置

function breadcrumbs($arr, $id) {
  $ret = [];
  // untill top category or incorrect data
  while ($id and ! is_null($key = get_key($arr, $id))) {
    // save current category name
    array_unshift($ret, $arr[$key]['category_name']);
    // step up
    $id = $arr[$key]['parent_id'];
  }
  return implode(' > ', $ret);
}

echo breadcrumbs($arr, 9); // Vehicle > Bmw X Series > Bmw X7

demo

答案 1 :(得分:0)

您可以使用recurcive功能:

function getById($array, $id){
  foreach ($array as $a) {
     if ($a['id'] == $id) {
        return $a;
     }
   }
 return null;
}

function findP($arr, $id) {
    $search = getById($arr, $id);
    $parentId = $search['parent_id'];
    if ($parentId == 0) {
        return $search['id'];
    }
    return findP($arr, $parentId);
}