您的位置:首页 > 编程语言 > PHP开发

php非递归无限级分类.

2015-03-02 12:06 435 查看
项目需要.递归无限级分类效率实在太低.理了半天思路写的.

分类越多效率越高.

/**
* 单次循环返回无限极分类嵌套
* @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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: