单纯的1转是,0转否并不难,写个foreach遍历一下单独处理就可以了,可是如果层级较深,数据量很大,foreach嵌套foreach的话,难免不会内存报错。
array_map(),array_walk(),array_walk_recursive(),考虑的又这三个函数,
其中array_map()得不到key值,array_walk()只能得到第一层的一层的数据,多层的话使用array_walk_recursive(data, function(value, key){})可以自动判断value是数组的话会自动递归遍历,这就解决了层级很深的数组值转换的问题,代码如下:
/**
* 转换年报告企业信息列表的数据0-否 1-是
* 对registion_region做转换:如1->溧阳镇
*/
public function getNumToString($data){
$replace_fields = model('DataFields')->where('field_type','=','tinyint')->column('field_name');
$country = model('country')->column('country','id');
array_walk_recursive($data, function(&$v ,$k) use($replace_fields, $country){
//对tinyint数据0/1转换成否/是
if(in_array($k, $replace_fields)){
if($v == 1){
$v = '是';
}else{
$v = '否';
}
}
//对registion_region做转换:如1->溧阳镇
if($k == 'registration_region'){
$v = $country[$v];
}
//对credit_code做特殊处理,避免科学计数法
if($k == 'credit_code'){
$v = $v.' ';
}
});
return $data;
}
上面的credit_code字段的处理方式避免EXCEL导出的时候超过15长度的数字变成科学计数法的方式
同时,还有个瓜皮要求,乡镇名导入的时候将输入的中文模糊匹配,转换成对应的id,代码如下:
/**
* 转换年报告企业信息列表的数据:否->0 是->1
* 将镇区模糊匹配,专换成对应的数字
*/
public function getStringToNum($data){
$replace_fields = model('DataFields')->where('field_type','=','tinyint')->column('field_name');
$country = model('country')->column('id','country');
array_walk_recursive($data, function(&$v ,$k) use($replace_fields, $country){
if(in_array($k, $replace_fields)){
if($v == '是'){
$v = 1;
}else{
$v = 0;
}
}
//对registion_region做转换:如 溧阳镇->1
if($k == 'registration_region'){
foreach ($country as $key => $value) {
if(strstr($v, $key)){
$v = $value;
goto a;
}
}
$v = '';
}
a:
});
return $data;
}