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;
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。