从动态数据集生成PHP数组树结构
我有一段历史,在这方面我做了很多。我想也许我用错锤子了 我试图从一个数组中创建一个树层次结构数据集,而不仅仅是一个定义了父子关系的数组。它相当于将数据集中的一个数组与另一个数组进行比较,然后将相同的数组组合起来,并将差异分支到一个新数组中 这背后的原因是为了稍后搜索数据集(如ACL),这些数据集预计会很大,并通过API调用返回此格式 从一个PHP和MySQL查询中,我返回一个数组,看起来像这样。键值对可以是任何东西,这只是一个泛化:从动态数据集生成PHP数组树结构,php,recursion,hierarchical,Php,Recursion,Hierarchical,我有一段历史,在这方面我做了很多。我想也许我用错锤子了 我试图从一个数组中创建一个树层次结构数据集,而不仅仅是一个定义了父子关系的数组。它相当于将数据集中的一个数组与另一个数组进行比较,然后将相同的数组组合起来,并将差异分支到一个新数组中 这背后的原因是为了稍后搜索数据集(如ACL),这些数据集预计会很大,并通过API调用返回此格式 从一个PHP和MySQL查询中,我返回一个数组,看起来像这样。键值对可以是任何东西,这只是一个泛化: $testArray = array( array('
$testArray = array(
array('group' => 'Group1','group_id' => '1','portal' => 'Portal1','portal_id' => '1','role' => 'Role1','role_id' => '1','permission' => 'Permission1','permission_id' => '1'),
array('group' => 'Group1','group_id' => '1','portal' => 'Portal1','portal_id' => '1','role' => 'Role1','role_id' => '1','permission' => 'Permission2','permission_id' => '2'),
array('group' => 'Group1','group_id' => '1','portal' => 'Portal2','portal_id' => '2','role' => 'Role1','role_id' => '1','permission' => 'Permission3','permission_id' => '3'),
array('group' => 'Group1','group_id' => '1','portal' => 'Portal2','portal_id' => '2','role' => 'Role2','role_id' => '2','permission' => 'Permission1','permission_id' => '1'),
array('group' => 'Group2','group_id' => '2','portal' => 'Portal1','portal_id' => '1','role' => 'Role3','role_id' => '3','permission' => 'Permission1','permission_id' => '1'),
array('group' => 'Group2','group_id' => '2','portal' => 'Portal1','portal_id' => '1','role' => 'Role3','role_id' => '3','permission' => 'Permission2','permission_id' => '2')
);
以下情况后的伪输出:
(Group_Name = Group1, Group_ID = 1)
(Portal_Name = Portal1, Portal_id = 1) (Portal_Name = Portal2, Portal_id = 2)
(Role,RoleID) (Role,RoleID)
(Permission,Permission_id) (Permission,Permission_id)
这是WIP函数。ATM机上到处都是,但我的脑袋就在这里:
//List of keyList to compare against
if(is_array($testArray[0])) {
$keyList = array_keys($testArray[0]);
}
function buildTree(&$data, $keyList) {
$branch = array();
$tree = array();
foreach($keyList as $k => &$keyName) {
//Each row in the data set is an array
foreach($data as $rowKey => &$rowArraySet) {
//If the branch key exists, and matches
if(isset($rowArraySet[$keyName]) && isset($keyList[$keyName]) &&
isset($branch[$keyList[$keyName]][$rowArraySet[$keyName]])) {
if(isset($data[1+$rowKey]) &&
$rowArraySet[$keyName] == $data[1+$rowKey][$keyName]) {
$branch[$keyName][$rowArraySet[$keyName]] = array_diff($rowArraySet, $rowArraySet[$keyName]);
unset($data[$rowKey]);
}
}
//If the branch does not exist, and matches next array record
else if(isset($data[1+$rowKey]) &&
$rowArraySet[$keyName] == $data[1+$rowKey][$keyName]) {
$branch[$keyName] = array();
$branch[$keyName][$rowArraySet[$keyName]] = array_diff($rowArraySet, array($keyName => $rowArraySet[$keyName]));
unset($data[$rowKey]);
}
//Create new branch key (no match)
else if(isset($rowArraySet[$keyName])) {
$branch[$keyName] = array();
$branch[$keyName][$rowArraySet[$keyName]] = array_diff($rowArraySet, array($keyName => $rowArraySet[$keyName]));
unset($data[$rowKey]);
}
echo $rowKey;
}
//Remove keyName from checking
unset($keyList[$k]);
//Compare branch
//$tree[] = buildTree($branch, &$keyList);
//echo '<pre>';
//var_dump($branch);
//die;
}
return $tree;
}
是的,我知道程序员和无文档代码在地狱里有一个小小的位置。我的想法是这样的:
从集合中的第一个数组捕获密钥这是类似父子关系的关系,至少是要检查的顺序
使用键将集合中的每个数组相互比较(如果存在)/集合等
匹配值将创建一个新分支,并将数组移到上面,然后将它们组合在一起
检查下一组,并检查分支中是否存在键
完成后对分支进行递归排序
将分支返回到树数组和输出树
一如往常,任何指导都是值得赞赏的。我觉得我就快弄明白了,我只是无法控制自己。多谢各位
根据建议进行编辑。有什么方法可以精简它,使其更简洁?就目前情况而言,这有很多需要通读的地方。如果你能以一种可用的形式给我们数组,让我们可以进行测试,这会很有帮助。例如:$testing\u array=arraygroup\u name=>learners,etc=>etc等等;是的,我会编辑它并清理一些!这个周末我越是研究这个问题,我就越觉得我对数组的期望太高了,写一个存储数据和关系的基本节点/嵌套对象可能会更好。