php非递归无限级分类.
项目需要.递归无限级分类效率实在太低.理了半天思路写的.
分类越多效率越高.
/** * 单次循环返回无限极分类嵌套 * @param array $data 操作的数组 * @param string $columnPri 唯一键名,如果是表则是表的主键 * @param string $columnPid 父ID键名 * @return array */ function region_tree($data, $columnPri, $columnPid) { define(‘__parent_id‘, $columnPid); define(‘__pri_id‘, $columnPri); if (empty($data)) { return array(); } usort($data, function ($prev, $next) { return CStrCmp($prev[__parent_id],$next[__parent_id]); }); foreach ($data as $value) { $parent_id = $value[__parent_id]; $pri_id = $value[__pri_id]; if (isset(${$pri_id})) { $value[‘_data‘] = isset($value[‘_data‘]) ? array_merge($value[‘_data‘], ${$pri_id}) : ${$pri_id}; unset(${$pri_id}); } ${$parent_id}[] = $value; } unset($data, $key, $value, $columnPid, $columnPri, $pri_id); $dataArray = ${$parent_id}[0]; return $dataArray; } /** * 无限递归关联函数 * 兼容5.3-写的 * @param $a * @param $b * @return int */ function CStrCmp($a, $b) { if ($a == $b) return 0; return $a > $b ? -1 : 1; }
下面是递归无限极分类函数
/** * 递归返回无限极分类嵌套 * @param $data 操作的数组 * @param int $pid 一级PID的值 * @param string $fieldPri 唯一键名,如果是表则是表的主键 * @param string $fieldPid 父ID键名 * @return array */ function channelLevel($data, $pid = 0, $fieldPri = ‘cid‘, $fieldPid = ‘pid‘) { if (empty($data)) { return array(); } $arr = array(); foreach ($data as $v) { if ($v[$fieldPid] == $pid) { $arr[$v[$fieldPri]] = $v; $arr[$v[$fieldPri]]["region"] = channelLevel($data, $v[$fieldPri], $fieldPri, $fieldPid); } } return $arr; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。