我有存储在自身引用与亲子ID的数组数据集: id
, parent_id
, title
等顶级有着parent_id
的0
,并且可以有无数的父子关系。
所以我选在这个数组用foreach
递归函数内环路要检查它的父元素每个数组元素,我想我已经在这个方法太长时间盯着。
我最终在正确的顺序中的元素,但我似乎无法让我的列表中正确的嵌套,这让我觉得,该方法并未真正发挥作用。
- 这是采取的最佳途径?
- 我能做些什么来改善和解决这个问题的方法
- 难道还有其他的把戏,我可以申请吗?
下面是我的源:
<div>
<div>Subpages</div>
<ul>
<?php subPages($this->subpages->toArray(), 0) ?>
</ul>
<br>
<a href="javascript:;" onclick="">Add New Subpage</a>
</div>
<?php
function subPages($subpages, $parent){
foreach($subpages as $key => &$page){
$newParent = $page['id'];
//If the current page is the parrent start a new list
if($page['id'] == $parent)
{
//Echo out a new list
echo '<ul>';
echo '<li class="collapsed">';
echo '<a href="javascript:;" class="toggle">+</a>';
echo '<a href="javascript:;" onclick="">'.$page['title'].'</a>';
subPages($subpages, $newParent);
echo '</li>';
echo '</ul>';
}
//If the page's parent id matches the parent provided
else if($page['parent_id'] == $parent)
{
//Echo out the link
echo '<li class="collapsed">';
echo '<a href="javascript:;" class="toggle">+</a>';
echo '<a href="javascript:;" onclick="">'.$page['title'].'</a>';
//Set the page as the new parent
$newParent = $page['id'];
//Remove page from array
unset($subpages[$key]);
//Check the rest of the array for children
subPages($subpages, $newParent);
echo '</li>';
}
}
}
?>
与往常一样,任何援助表示赞赏。 请让我知道,如果事情是不明确的。
我怀疑你们仍然在寻找一个真正的答案,但它可能会帮助别人走出具有同样的问题。 下面是一个递归函数诉诸数组将儿童的父母之下。
$initial = array(
array(
'name' => 'People',
'ID' => 2,
'parent' => 0
),
array(
'name' => 'Paul',
'ID' => 4,
'parent' => 2
),
array(
'name' => 'Liz',
'ID' => 5,
'parent' => 2
),
array(
'name' => 'Comus',
'ID' => 6,
'parent' => 3
),
array(
'name' => 'Mai',
'ID' => 7,
'parent' => 2
),
array(
'name' => 'Titus',
'ID' => 8,
'parent' => 3
),
array(
'name' => 'Adult',
'ID' => 9,
'parent' => 6
),
array(
'name' => 'Puppy',
'ID' => 10,
'parent' => 8
),
array(
'name' => 'Programmers',
'ID' => 11,
'parent' => 4
) ,
array(
'name' => 'Animals',
'ID' => 3,
'parent' => 0
)
);
/*---------------------------------
function parentChildSort_r
$idField = The item's ID identifier (required)
$parentField = The item's parent identifier (required)
$els = The array (required)
$parentID = The parent ID for which to sort (internal)
$result = The result set (internal)
$depth = The depth (internal)
----------------------------------*/
function parentChildSort_r($idField, $parentField, $els, $parentID = 0, &$result = array(), &$depth = 0){
foreach ($els as $key => $value):
if ($value[$parentField] == $parentID){
$value['depth'] = $depth;
array_push($result, $value);
unset($els[$key]);
$oldParent = $parentID;
$parentID = $value[$idField];
$depth++;
parentChildSort_r($idField,$parentField, $els, $parentID, $result, $depth);
$parentID = $oldParent;
$depth--;
}
endforeach;
return $result;
}
$result = parentChildSort_r('ID','parent',$initial);
print '<pre>';
print_r($result);
print '</pre>';
这是一个放松下来的方法,可以消除原来的数组元素,并将它们放入结果以适当的顺序设置。 我把它给你多少有些通用的,所以它只是需要你告诉它你的“ID”字段和“父”字段叫什么。 顶级的项目都要求有一个PARENT_ID(但你的名字)的0。我还添加了一个深度标记,每一个项目,这样就可以在输出格式。
我会尽力帮助你的。
它有可能在一个通撰写这样的关系:
/**
* Used for "recursive" folding of layout items
* Algorithm of infinite tree (non recursive method)
*
* @param array $items
* @return array
*/
function _foldItems($items) {
$result = array();
foreach ($items as $key => $item) {
$itemName = $item['name'];
if (!isset($item['parent']))
continue;
else {
$parentName = $item['parent']; // it can be either `name` or some `id` of the parent item
if (isset($result[$itemName][$item['sequence']])) {
// Done to eliminate `Warning: Cannot use a scalar value as an array in atLeisure_PropertyImport.class.php`
// Sometimes elements already in the list and have [name] => $count and next line tries to put item in array (item becomes parent)
if ( isset($result[$parentName][$item['parentSequence']]['items'][$itemName]) AND
is_scalar($result[$parentName][$item['parentSequence']]['items'][$itemName])
)
$result[$parentName][$item['parentSequence']]['items'][$itemName] = array();
$result[$parentName][$item['parentSequence']]['items'][$itemName][$item['sequence']] = $result[$itemName][$item['sequence']];
unset($result[$itemName][$item['sequence']]);
} else
$result[$parentName][$item['parentSequence']]['items'][$itemName] = $item['count'];
unset($items[$key]);
} // if //
if (empty($result[$itemName]))
unset($result[$itemName]);
} // foreach //
foreach ($items as $item) { // enumerating rest of the items (single items)
$itemName = $item['itemName'];
if (!isset($result[$itemName]))
$result[$itemName][$item['sequence']] = $item['count'];
}
return $result;
}
例如可以是一个有点难以阅读和理解的,因为真的是有太多的代码,但是我做了这个功能不是很久以前一个项目,它似乎是工作顺利。
注意:这也将工作,如果有链接到一个父项几个相同的项目。 它使用项目的序列号,以避免混叠类似的值成一个。
文章来源: A recursive function to sort through parent and child nodes in PHP using a foreach loop on an array