<?php/*** PHP数组无限级分组* @baseFrom http://blog.phpdr.net/php%E6%97%A0%E6%9E%81%E5%88%86%E7%BB%84.html** @param array $list 数据源* @param mixed $columns 最内层需要提取数据的字段* @param mixed $group 分组 如果为空,不分组; 如果为数组,多个值按顺序分别作为多维数组键值* @param mixed $primary 主键 如果为空,以数字为键值;如果为数组,以多个值拼接作为键值* @return array*/function dict(array $list, $columns = null, $group = null, $primary = null) {if (! isset ( $primary )) {$primary = array ();}if (is_string ( $primary )) {$primary = array ($primary);}if (is_string ( $group )) {$group = array ($group);}$listNew = array ();foreach ( $list as $v ) {//如果指定主键,拼接主键$key = null;foreach ( $primary as $p ) {$key .= $v [$p];}//提取字段if (isset ( $columns )) {//$columns = array(null) 提取字段结果为nullif (is_array ( $columns ) && 1 === count ( $columns ) && $columns [0] === null) {$vNew = null;} else {$vNew = array ();if (is_array ( $columns )) {//$columns = array('col1', 'col2') 循环提取字段,若数组为空,则提取字段结果为空数组foreach ( $columns as $k1 => $v1 ) {if (is_int ( $k1 )) {$k1 = $v1;}$vNew [$k1] = $v [$v1];}} else {$vNew = $v [$columns];}}} else { //$columns = null 提取所有字段$vNew = $v;}//切换数据存储位置到指定分组if (isset ( $group )) {$vGroup = &$listNew;//遍历分组foreach ( $group as $v2 ) {//分组不存在,设置为空数组if (!isset ( $vGroup[$v [$v2]] )) {$vGroup [$v [$v2]] = array ();}//当前分组切换到新位置$vGroup = &$vGroup [$v [$v2]];}//指定主键,用主键为键值存储字段信息if (isset ( $key )) {$vGroup [$key] = $vNew;} else { //未指定主键,以索引数组存储字段信息$vGroup [] = $vNew;}} else {//指定主键,用主键为键值存储字段信息if (isset ( $key )) {$listNew [$key] = $vNew;} else { //未指定主键,以索引数组存储字段信息$listNew [] = $vNew;}}}return $listNew;}//示例$list = array ();$list [] = array ('id' => 1,'name' => '学生1','school' => '学校1','class' => '班级1');$list [] = array ('id' => 4,'name' => '学生4','school' => '学校2','class' => '班级2');$list [] = array ('id' => 2,'name' => '学生2','school' => '学校1','class' => '班级2');$list [] = array ('id' => 3,'name' => '学生3','school' => '学校2','class' => '班级1');$list [] = array ('id' => 5,'name' => '学生5','school' => '学校2','class' => '班级3');//源数组print_r($list);//1. 提取name字段print_r ( dict ( $list, 'name' ) );//2. 提取空字段(数据项为null)var_dump ( dict ( $list, array (null) ) );//3. 提取空字段(数据项为array)var_dump ( dict ( $list, array () ) );//4. 提取多个指定字段,以id为主键print_r ( dict ( $list, array ('id','name','school'), null, 'id' ) );//5. 指定两个字段拼接为主键,提取所有字段print_r ( dict ( $list, null, null, array ('class','name') ) );//6. 以school为分组,以id为主键,提取name字段print_r ( dict ( $list, array ('name'), 'school', 'id' ) );//7. 以school和class为分组,以id为主键,提取name字段print_r ( dict ( $list, array ('name'), array ('school','class'), 'id' ) );//8. 无限级重组演示(数据源比较单薄,暂且这么演示)print_r ( dict ( $list, array ('name'), array ('school','class','school','class','school','class',), 'id' ) );
运行结果:PHP无限级分组(注释版)
原文见PHP无限级分组
未经同意禁止转载!
转载请附带本文原文地址:PHP数组无限级分组,首发自 Zjmainstay学习笔记




