我被困住了。我想我需要写一个递归方法,但我无法弄清楚如何...!
我正在尝试将父子关系数组转换为稍后将向用户显示的分层树。
这是我可能拥有的输入数据的示例:
$input = array(
array(
'itemGroupID' => 1,
'childItemGroupID' => 2
),
array(
'itemGroupID' => 1,
'childItemGroupID' => 3
),
array(
'itemGroupID' => 1,
'childItemGroupID' => 4
),
array(
'itemGroupID' => 1,
'childItemGroupID' => 212
),
array(
'itemGroupID' => 1,
'childItemGroupID' => 339
),
array(
'itemGroupID' => 1,
'childItemGroupID' => 336
),
array(
'itemGroupID' => 1,
'childItemGroupID' => 6
),
array(
'itemGroupID' => 1,
'childItemGroupID' => 5
),
array(
'itemGroupID' => 6,
'childItemGroupID' => 8
),
array(
'itemGroupID' => 6,
'childItemGroupID' => 9
),
array(
'itemGroupID' => 6,
'childItemGroupID' => 10
),
array(
'itemGroupID' => 6,
'childItemGroupID' => 11
),
array(
'itemGroupID' => 6,
'childItemGroupID' => 12
),
array(
'itemGroupID' => 6,
'childItemGroupID' => 13
),
array(
'itemGroupID' => 6,
'childItemGroupID' => 74
),
array(
'itemGroupID' => 9,
'childItemGroupID' => 15
),
array(
'itemGroupID' => 10,
'childItemGroupID' => 16
),
array(
'itemGroupID' => 11,
'childItemGroupID' => 17
),
array(
'itemGroupID' => 12,
'childItemGroupID' => 18
),
array(
'itemGroupID' => 13,
'childItemGroupID' => 19
),
array(
'itemGroupID' => 74,
'childItemGroupID' => 75
)
);
我希望以以下格式取回数据:
$output = array(
array(
'itemGroupID' => 1,
'children' => array(
array(
'itemGroupID' => 2
),
array(
'itemGroupID' => 3
),
array(
'itemGroupID' => 4
),
array(
'itemGroupID' => 212
),
array(
'itemGroupID' => 339
),
array(
'itemGroupID' => 336
),
array(
'itemGroupID' => 6,
'children' => array(
array(
'itemGroupID' => 8
),
array(
'itemGroupID' => 9,
'children' => array(
array(
'itemGroupID' => 15
)
)
),
array(
'itemGroupID' => 10,
'children' => array(
array(
'itemGroupID' => 16
)
)
),
array(
'itemGroupID' => 11,
'children' => array(
array(
'itemGroupID' => 17
)
)
),
array(
'itemGroupID' => 12,
'children' => array(
array(
'itemGroupID' => 18
)
)
),
array(
'itemGroupID' => 13,
'children' => array(
array(
'itemGroupID' => 19
)
)
),
array(
'itemGroupID' => 74,
'children' => array(
array(
'itemGroupID' => 75
)
)
)
)
),
array(
'itemGroupID' => 5
)
)
)
);
我设法编写了一些代码,可以告诉我从根开始。(因为我担心如果你从第一个节点递归,结果可能会发现这已经是从链的一半开始了......
顺便说一句,元素 I 输出可用于获取每个分层链的起始索引。
private function _arraySearch($arr, $callback)
{
foreach ($arr as $key => $item) {
if ($callback($item)) {
return $key;
}
}
return false;
}
private function _findRootsOfItemGroupTree($activeItemGroupChildren)
{
$searchArray = $activeItemGroupChildren;
$roots = array();
foreach ($activeItemGroupChildren as $itemGroupChild) {
$parentItemGroupID = $itemGroupChild['itemGroupID'];
$found = array_filter($searchArray, function ($element) use ($parentItemGroupID) {
return $element['childItemGroupID'] == $parentItemGroupID;
});
$rootItemGroupID = $parentItemGroupID;
if (count($found) == 0
&& $this->_arraySearch($roots,
function ($element) use ($rootItemGroupID) {
return $element['itemGroupID'] == $rootItemGroupID;
}) === false) {
$roots[] = $itemGroupChild;
}
}
return $roots;
}
但是,我现在需要使用此信息来创建新的关联数组。我不知道怎么做。(我将在几分钟内发布一些工作原理。
想法?
注意:假设此结构中没有递归循环,即使它们在技术上可能存在。
如果我
正确理解您的问题,这应该可以工作。请注意我如何在函数内调用 orderMe
函数以使其递归。
function orderMe($input, $parentId)
{
$return = array($parentId => array('itemGroupID' => $parentId));
$childs = array();
foreach ($input as $i)
{
if ($i['itemGroupID'] == $parentId)
{
$return[$i['itemGroupID']]['children'][$i['childItemGroupID']] = array('itemGroupID' => $i['childItemGroupID']);
$childs[] = $i['childItemGroupID'];
}
if (in_array($i['childItemGroupID'], $childs))
{
$allChilds = orderMe($input, $i['childItemGroupID']);
if (!empty($allChilds[$i['childItemGroupID']]['children']))
$return[$i['itemGroupID']]['children'][$i['childItemGroupID']] = $allChilds;
}
}
return $return;
}
print_r(orderMe($input, 1));
输出:
array (
1 =>
array (
'itemGroupID' => 1,
'children' =>
array (
2 =>
array (
'itemGroupID' => 2,
),
3 =>
array (
'itemGroupID' => 3,
),
4 =>
array (
'itemGroupID' => 4,
),
212 =>
array (
'itemGroupID' => 212,
),
339 =>
array (
'itemGroupID' => 339,
),
336 =>
array (
'itemGroupID' => 336,
),
6 =>
array (
6 =>
array (
'itemGroupID' => 6,
'children' =>
array (
8 =>
array (
'itemGroupID' => 8,
),
9 =>
array (
9 =>
array (
'itemGroupID' => 9,
'children' =>
array (
15 =>
array (
'itemGroupID' => 15,
),
),
),
),
10 =>
array (
10 =>
array (
'itemGroupID' => 10,
'children' =>
array (
16 =>
array (
'itemGroupID' => 16,
),
),
),
),
11 =>
array (
11 =>
array (
'itemGroupID' => 11,
'children' =>
array (
17 =>
array (
'itemGroupID' => 17,
),
),
),
),
12 =>
array (
12 =>
array (
'itemGroupID' => 12,
'children' =>
array (
18 =>
array (
'itemGroupID' => 18,
),
),
),
),
13 =>
array (
13 =>
array (
'itemGroupID' => 13,
'children' =>
array (
19 =>
array (
'itemGroupID' => 19,
),
),
),
),
74 =>
array (
74 =>
array (
'itemGroupID' => 74,
'children' =>
array (
75 =>
array (
'itemGroupID' => 75,
),
),
),
),
),
),
),
5 =>
array (
'itemGroupID' => 5,
),
),
),
)