<?php function get_cate($arr){ static $cat_options = array(); if (!isset($cat_options[0])) { $level = $last_cat_id = 0; $options = $cat_id_array = $level_array = array(); if ($data === false) { while (!empty($arr)) { foreach ($arr AS $key => $value) { $cat_id = $value[‘cat_id‘]; if ($level == 0 && $last_cat_id == 0) { if ($value[‘parent_id‘] > 0) { // 非父类 break; } $options[$cat_id] = $value; $options[$cat_id][‘level‘] = $level; $options[$cat_id][‘id‘] = $cat_id; $options[$cat_id][‘name‘] = $value[‘cat_name‘]; unset($arr[$key]); if ($value[‘has_children‘] == 0) { continue; } $last_cat_id = $cat_id; $cat_id_array = array($cat_id); $level_array[$last_cat_id] = ++$level; continue; } // end if ($level == 0 && $last_cat_id == 0) if ($value[‘parent_id‘] == $last_cat_id) { $options[$cat_id] = $value; $options[$cat_id][‘level‘] = $level; $options[$cat_id][‘id‘] = $cat_id; $options[$cat_id][‘name‘] = $value[‘cat_name‘]; unset($arr[$key]); if ($value[‘has_children‘] > 0) { if (end($cat_id_array) != $last_cat_id) { $cat_id_array[] = $last_cat_id; } $last_cat_id = $cat_id; $cat_id_array[] = $cat_id; $level_array[$last_cat_id] = ++$level; } } // eof if ($value[‘parent_id‘] == $last_cat_id) elseif ($value[‘parent_id‘] > $last_cat_id) { break; } // eof if ($value[‘parent_id‘] == $last_cat_id) } // end foreach ------------ $count = count($cat_id_array); if ($count > 1) { $last_cat_id = array_pop($cat_id_array); } elseif ($count == 1) { if ($last_cat_id != end($cat_id_array)) { $last_cat_id = end($cat_id_array); } else { $level = 0; $last_cat_id = 0; $cat_id_array = array(); continue; } } if ($last_cat_id && isset($level_array[$last_cat_id])) { $level = $level_array[$last_cat_id]; } else { $level = 0; } } // end while ------------ //如果数组过大,不采用静态缓存方式 if (count($options) <= 2000) { write_static_cache(‘cat_option_static‘, $options); } } else { $options = $data; } $cat_options[0] = $options; } else { $options = $cat_options[0]; } if (!$spec_cat_id) { return $options; } else { if (empty($options[$spec_cat_id])) { return array(); } $spec_cat_id_level = $options[$spec_cat_id][‘level‘]; foreach ($options AS $key => $value) { if ($key != $spec_cat_id) { unset($options[$key]); } else { break; } } $spec_cat_id_array = array(); foreach ($options AS $key => $value) { if (($spec_cat_id_level == $value[‘level‘] && $value[‘cat_id‘] != $spec_cat_id) || ($spec_cat_id_level > $value[‘level‘])) { break; } else { $spec_cat_id_array[$key] = $value; } } $cat_options[$spec_cat_id] = $spec_cat_id_array; return $spec_cat_id_array; } }
原文:http://www.cnblogs.com/lin3615/p/5092485.html