我试图从表中检索层次结构数据,但失败了。该表有(目前)以下列: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);
}