当对象密钥未知但对象中已知的子密钥

时间:2017-06-19 14:15:39

标签: php object

下面列出了PHP PDO中mySQL查询的输出。该对象包含来自两个表的多个列,然后将这些列组合到一个对象中。

同一个表中的某些行是列parent_ID标识的其他行。然后,这些孩子需要像孩子一样被添加到父母的对象中,依此类推。

尽管我可以简单地为前两个级别的孩子实现这一点,但是如果没有执行另一个foreach来实现这一目标,我就无法实现这一目标。

这个例子应该增加上述内容:

foreach($components as $component){
    if($component->parent_ID < 0){
      $output->{$component->ID} = $component;
    }
    else if($output->{$content->parent_ID}){
      $output->{$content->parent_ID}->child->{$component->ID} = $component;
    }
    else if($output->?->child->{$conent->parent_ID}){
      $output->?->child->{$content->parent_ID}->child->{$component->ID} = $component;
    }
  }

不在第三行有一个?通常会有ID的地方。这是因为我们现在不知道该ID是什么。在第一层我们做了因为它是parent_ID,但是这一行正在处理父母子女的子女。

1 个答案:

答案 0 :(得分:1)

所以,我到目前为止我从评论中理解并假设你在DB中没有很多记录,在我看来,最好的方法是从DB预加载所有行然后构建使用此功能的树

public function buildTree(array &$objects) {
        /** thanks to tz-lom */
        $index = array();
        $relations = array();

        foreach($objects as $key => $object) {
            $index[$object->getId()] = $object->setChildren(array());


            $relations[$object->getParentId()][] = $object;


            if ($object->getParentId()) {
                unset($objects[$key]);
            }
        }

        foreach ($relations as $parent => $children) {
            foreach ($children as $_children) {
                if ($parent && isset($index[$parent])) {
                    $index[$parent]->addChildren($_children->setParent($index[$parent]));

                }
            }
        }
        return $this;
    }

P.S。实际上,foreach中没有foreach,我看不到其他方式。至少,它不是递归的