函数

    /**
     * 将线性数据转为树形数据
     *
     * @param array $arrData    需要转换的数据集
     * @param string $strId     主键标记字段
     * @param string $strPid    父级标记字段
     * @param string $strChild  保存子集数组字段
     * @param integer $parentId 需要生成某个父级ID
     * @return void
     */
    public function tree($arrData,$strId="id",$strPid="pid",$strChild="child" ,$parentId = 0)
    {
        if(!is_array($arrData)){
            //如果不是数组返回空
            return [];
        }
        //生成基于主键索引的数组进行引用
        $arrList = array();
        foreach($arrData as $k => $v){
            $arrList[$v[$strId]] = &$arrData[$k];
        }
        $arrTree = [];//存放处理好的数据
        //循环生成tree
        foreach($arrData as $k => $v){
            if($parentId == $v[$strPid]){
                //找顶级部门,将现在遍历的顶级数组变量地址赋值给找到顶级分类
                $arrTree[] = &$arrData[$k];
            }else{
                //如果不是顶级部门,进来通过之前生成基于主键索引的找他上级
                if(isset($arrList[$v[$strPid]])){
                    //找到他上级
                    $arrChild = &$arrList[$v[$strPid]];//生成一个临时子集变量将他的父级数据地址写进去
                    $arrChild[$strChild][] = &$arrData[$k];//将他写进带他爸爸数据的临时子集变量里,因为是变量地址,所以修改修改时同步进行的,所以引用索引的地址改变后在数据源数组内也会跟着改变
                }
            }
        }
        return $arrTree;
    }

变量前+&解释

把实参,也就是这个变量的地址传给函数,函数内的操作会直接影响到函数外面的值。也就是说,$a=”1234″ $b=&a 这时不管修改$a还是$b 这时打印哪个变量都是打印出修改后的值

$a= "123";
$b = &$a;
echo $a.' <- $a ------- $b -> '.$b.' <br>';
$a = '234';
echo $a.' <- $a ------- $b -> '.$b.' <br>';
$a = '345';
echo $a.' <- $a ------- $b -> '.$b.' <br>';
exit;

123 <- $a ------- $b -> 123
234 <- $a ------- $b -> 234
345 <- $a ------- $b -> 345 
说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...