$arr = [
    [
        'id' => 1,
        'name' => '软件开发',
        'parent_id' => 0,
        'total' => 5 + 6(属于他的节子点就是id =3 的total ) + 10(属于他的节子点就是id =4 的total )
    ],
    [
        'id' => 2,
        'name' => '系统技术',
        'parent_id' => 0,
        'total' => 3 + 12(属于他的节子点就是id =5的total ) + 68(属于他的节子点就是id =6 的total )
    ],
    [
        'id' => 3,
        'name' => 'PHP',
        'parent_id' => 1,
        'total' => 6
    ],
    [
        'id' => 4,
        'name' => 'Javascript',
        'parent_id' => 1,
        'total' => 10
    ],
    [
        'id' => 5,
        'name' => 'Windows10',
        'parent_id' => 2,
        'total' => 12
    ],
    [
        'id' => 6,
        'name' => 'Windows7',
        'parent_id' => 2,
        'total' => 68
    ],
];想得到这样的结果,希望大神帮助下,,脑子都死了上亿个细胞了。。
$arr = [
    [
        'id' => 1,
        'name' => '软件开发',
        'parent_id' => 0,
        'total' => 5
    ],
    [
        'id' => 2,
        'name' => '系统技术',
        'parent_id' => 0,
        'total' => 3
    ],
    [
        'id' => 3,
        'name' => 'PHP',
        'parent_id' => 1,
        'total' => 6
    ],
    [
        'id' => 4,
        'name' => 'Javascript',
        'parent_id' => 1,
        'total' => 10
    ],
    [
        'id' => 5,
        'name' => 'Windows10',
        'parent_id' => 2,
        'total' => 12
    ],
    [
        'id' => 6,
        'name' => 'Windows7',
        'parent_id' => 2,
        'total' => 68
    ],
];

解决方案 »

  1.   

    function treeKeySum($arr, $pid = 0) {
        // 初始化数组
        $tree = [];
        // 判断数组不为空
        if(!empty($arr)) {
            // 新建一个数组初始化
            $newArr = [];
            // 遍历传递过来的变量数组$arr
            foreach($arr as $key => $value){
                // 以遍历得到的数组id为索引赋值给新数组$newArr
                $newArr[$value['id']] = $value;
            }
            // 遍历新数组
            foreach($newArr as $index => $item) {
                // 判断数组指定作为顶级标识的字段是否等于遍历结果数组的值
                if($pid == $item['parent_id']) {
                    // 遍历结果赋值给新数组$tree 这里加了个&是$tree的结果随着$newArr的值改变
                    $tree[] = &$newArr[[$item['id']];
                    // 判断$newArr[比如$item['parent_id']] != 0 就往下操作
                } elseif(isset($newArr[$item['parent_id']])) {
                    // 计算指定数组key的值之和 这里的$newAr[$item['parent_id'] 实际上就是得到当前查询数组的父级id索引值 比如 $item['parent_id'] = 1 那这里就是$newArr[1]['total'] 
                    $newArr[$item['parent_id']]['total'] = $newArr[$item['parent_id']]['total'] + $newArr[$item['id']]['total'];
                    // 重新拼接数组
                    array_push($tree, $newArr[$item['io']]);
                }
            }
              // 删除$newArr
              unset($newArr);
              // 返回结果
              return $tree;
        }
    }
      

  2.   


    foreach ($arr as $key => $value) {
        $result[$value['id']] = $value;
    }
    foreach ($arr as $key => $value) {
        if($value['parent_id']==0){ //如果parent_id==0 则不做修改
            continue;
        }else{ //否则将total累加
            $result[$value['parent_id']]['total'] += $value['total'];
        }
    }
    var_dump(array_values($result));