缺点:相同数据格式的数值无法叠加,页面数据格式太繁琐,最初下标值为整数的结构会出错
假设基础数据字段列表baseRowList格式是 array(array('pid'=>xxxx, 'id'=>xxxx, 'name'=>xxx, 'age'=>xxx), ....)
页面数据显示dataStruct格式是
array(
'list'=>array('pid'=> array('id' => array('name', 'age'))),
'nameList' => array('id'=>'name')
),
1. 将dataStruct数组 递归抽取转化为可显示层级结构的字符串
如将dataStruct转化为structList = array("list,pid,id,name", "list,pid,id,age", "nameList,id,name"), getStructList函数
2. 读取一条基础数据,循环分隔structList,将其中的字串关键字替换为基础数值或者不变
3. 重复循环2直至基础数据所有处理完成
代码如下:
private function getsRowStructData($baseRowList, $dataStruct){
$list = array();
if($baseRowList){
$structList = self::getStructList($dataStruct);
$rowKeyArr = self::getRowKeyArr($baseRowList);
foreach ($baseRowList as $row){
if($structList)
foreach ($structList as $struct){
$list = $list + self::getOneStructData(explode(',', $struct), $row, $rowKeyArr);
}
}
}
return $list;
}
// 获取 列表关键字下标数组
private function getRowKeyArr($list){
$arr = NULL;
if($list)
foreach ($list as $row)
if(is_array($row))
foreach ($row as $k => $v)
$arr[] = $k;
return $arr;
}
// 将层级结构数组中的关键字 替换为实际值,并返回 页面结构数据
private function getOneStructData($oneStructList, $dataRow, $rowKeyArr){
$row = array();
if($oneStructList){
for($i=count($oneStructList)-1; $i>=0; $i--){
if(in_array($oneStructList[$i], $rowKeyArr)){
$row = ($row) ? array($dataRow[$oneStructList[$i]]=>$row) : $dataRow[$oneStructList[$i]] ;
}
else{
$row = ($row) ? array($oneStructList[$i]=>$row) : $oneStructList[$i];
}
}
}
return $row;
}
// 根据页面显示的数据结构返回 层级结构数组
private function getStructList($struct, $list=array(), $prefix=NULL){
$tmpList = $list;
if(is_array($struct)){
foreach ($struct as $k => $v){
if(is_array($v)){
$tmpPrefix = ($prefix) ? "{$prefix},{$k}": $k;
$tmpList = self::getStructList($v, $tmpList, $tmpPrefix);
}
else{
$tmpPrefix = ($prefix) ? "{$prefix},{$v}": $v;
array_push($tmpList, $tmpPrefix);
}
}
return $tmpList;
}
elseif($struct){
array_push($tmpList, ($prefix) ? "{$prefix},{$struct}": $struct);
return self::getStructList(NULL, $tmpList, $prefix);
}
else
return $tmpList;
}