Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从动态数据集生成PHP数组树结构_Php_Recursion_Hierarchical - Fatal编程技术网

从动态数据集生成PHP数组树结构

从动态数据集生成PHP数组树结构,php,recursion,hierarchical,Php,Recursion,Hierarchical,我有一段历史,在这方面我做了很多。我想也许我用错锤子了 我试图从一个数组中创建一个树层次结构数据集,而不仅仅是一个定义了父子关系的数组。它相当于将数据集中的一个数组与另一个数组进行比较,然后将相同的数组组合起来,并将差异分支到一个新数组中 这背后的原因是为了稍后搜索数据集(如ACL),这些数据集预计会很大,并通过API调用返回此格式 从一个PHP和MySQL查询中,我返回一个数组,看起来像这样。键值对可以是任何东西,这只是一个泛化: $testArray = array( array('

我有一段历史,在这方面我做了很多。我想也许我用错锤子了

我试图从一个数组中创建一个树层次结构数据集,而不仅仅是一个定义了父子关系的数组。它相当于将数据集中的一个数组与另一个数组进行比较,然后将相同的数组组合起来,并将差异分支到一个新数组中

这背后的原因是为了稍后搜索数据集(如ACL),这些数据集预计会很大,并通过API调用返回此格式

从一个PHP和MySQL查询中,我返回一个数组,看起来像这样。键值对可以是任何东西,这只是一个泛化:

$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等等;是的,我会编辑它并清理一些!这个周末我越是研究这个问题,我就越觉得我对数组的期望太高了,写一个存储数据和关系的基本节点/嵌套对象可能会更好。