~~~ /** * 数组层级缩进转换 * @param array $array * @param int $pid * @param int $level * @return array */ function tree($array, $pid = 0, $level = 1) { static $list = []; foreach ($array as $v) { if ($v['pid'] == $pid) { $v['level'] = $level; $list[] = $v; tree($array, $v['id'], $level + 1); } } return $list; } /** * 构建层级(树状)数组 * @param array $array 要进行处理的一维数组,经过该函数处理后,该数组自动转为树状数组 * @param string $pid 父级ID的字段名 * @param string $child_key_name 子元素键名 * @return array|bool */ function array2tree(&$array, $pid = 'pid', $child_key_name = 'children') { $counter = array_children_count($array, $pid); if ($counter[0] == 0) return false; $tree = []; while (isset($counter[0]) && $counter[0] > 0) { $temp = array_shift($array); if (isset($counter[$temp['id']]) && $counter[$temp['id']] > 0) { array_push($array, $temp); } else { if ($temp[$pid] == 0) { $tree[] = $temp; } else { $array = array_child_append($array, $temp[$pid], $temp, $child_key_name); } } $counter = array_children_count($array, $pid); } return $tree; } /** * 子元素计数器 * @param $array * @param $pid * @return array */ function array_children_count($array, $pid) { $counter = []; foreach ($array as $item) { $count = isset($counter[$item[$pid]]) ? $counter[$item[$pid]] : 0; $count++; $counter[$item[$pid]] = $count; } return $counter; } /** * 把元素插入到对应的父元素$child_key_name字段 * @param $parent * @param $pid * @param $child * @param string $child_key_name 子元素键名 * @return mixed */ function array_child_append($parent, $pid, $child, $child_key_name) { foreach ($parent as &$item) { if ($item['id'] == $pid) { if (!isset($item[$child_key_name])) $item[$child_key_name] = []; $item[$child_key_name][] = $child; } } return $parent; ~~~