我试图从表中检索层次结构数据,但失败了。该表有(目前)以下列:ifc_key、ifc_name、ifc_parent。不使用ifc_键。(主键,但不用于此功能。
目的是得到一个数组。每个元素都是一个“父”接口。(因此,所有这些根元素都是没有ifc_父集的ifc_name值(如果已设置,则等于ifc_name)。
考虑以下布局(演示):
国际金融公司|国际金融公司|国际金融公司|母公司
0 |母公司|
1 | a0a |母公司|国际金融公司
2 | a0b |母公司|国际金融公司
3 | b0a | vif1
4 | b0b | vif1层
5 |振动1 | a0a
所以我要找的数组,是从一个查询生成的:

Array
(
[parent_ifc] => Array
    (
        [a0a] => Array
            (
                [vif1] => Array
                    (
                        [0] => b0a
                        [1] => b0b
                    )

            )

        [a0b] =>
    )
)

我想到的功能在这一段下面。我想创建一个递归函数,它在找到子级时调用自己,但问题是第一次调用此方法时没有选择任何子级。(父母空着的是父母自己)。所以我只让父母回来,但没有一个孩子(可能还有他们的孩子,等等——这在理论上是不确定的)。
public static function getByFilerOrganisedChildren($filer_id, $parent = '')
{
    $table   = new Filer_Interface_Table();
    $where[] = $table->getAdapter()->quoteInto('ifc_system_id = ?', $filer_id);
    $where[] = $table->getAdapter()->quoteInto('ifc_parent = ?', $parent);
    $rows    = $table->fetchAll($where, 'ifc_parent ASC');

    foreach ($rows as $row) {
        if ($row->ifc_parent == '') $data[] = $row->ifc_name;
        else {
            $data[$row->ifc_parent][] = $row->ifc_name;
            self::getByFilerOrganisedChildren($filer_id, $row->ifc_parent);
        }
    }

    return (isset($data) ? $data : false);
}

最佳答案

在使用方法之前,您没有提到ifc_system_id列,因此我认为这与问题没有直接关系。另外,您指定为所需的输出实际上不一致。
看来,您缺少的关键是使用与子记录相关的数据调用递归函数——在本例中,ifc_name而不是ifc_parent

public function getByFilerOrganisedChildren($filer_id, $parent = '')
{
    $table   = new Filer_Interface_Table();
    $where[] = $table->getAdapter()->quoteInto('ifc_system_id = ?', $filer_id);
    $where[] = $table->getAdapter()->quoteInto('ifc_parent = ?', $parent);
    $rows    = $table->fetchAll($where, 'ifc_parent ASC');

    $data = array();
    foreach ($rows as $row) {
        $data[$row->ifc_name] = $this->getByFilerOrganisedChildren($row->ifc_name);
    }

    return (! empty($data) ? $data : false);
}

10-07 23:44