公司有A、B两个系统,都有一个用户分组表,可是两边的分组数据却不一致。
现要在A系统里根据分组统计B系统里的数据。
在A系统里我只好,将A、B两者分组的对应关系写死,就有了如下形式的类:
class Setting{
/**
* @var array
*/
const GROUP_RELATION_CONFIG = [
'5' => 1,
'3' => 2,
'14' => 3,
'18' => 4,
'16' => [7,8,9,10],
'17' => [5,6,11],
];
//根据系统A的分组id获取B系统的分组id
public static function getGroupIdInB($groupIdA){
return in_array($groupIdA, array_keys(self::GROUP_RELATION_CONFIG)) ? self::GROUP_RELATION_CONFIG[$groupIdA]:0;
}
}
当实现B系统所有分组的业务统计时,涉及如下筛选逻辑:
where('group_id', array_values(Setting::GROUP_RELATION_CONFIG) )
可是看上面常量GROUP_RELATION_CONFIG的值就知道,它是二维数组,导致上面where条件不适用。
现在解决问题的思路:
1. 先将数组变成一维的。
2. 统计时,再将上面B系统的7、8、9、10分组和5、6、11分组分别统计汇总,再对应到A系统的16、17分组里去。
关于第1步,我实现的代码如下:
$arr = Setting::GROUP_RELATION_CONFIG; array_walk($arr, function($item, $key) use(&$arr){ if( is_array($item) ){ unset($arr[$key]); $arr = array_merge($arr, $item); } });
写的时候,发现上面代码执行过程自己也比较模糊,最主要的特色就是$arr数组在进入回调函数执行array_merge后就会发生变化。
array_walk是如何遍历$arr数组的呢?
为了方便观察结果,我写了如下测试代码:
$arr = array( "hello", "world", ["wind", "rain", "storm"], "翟码农", "乔峰", ["East", "West"] ); array_walk($arr, function($item, $key) use(&$arr){ if( is_array($item) ){ echo $key."<br>"; var_dump($arr[$key]); echo "<br>"; unset($arr[$key]); $arr = array_merge($arr, $item); var_dump($arr); echo "<br>"; }else{ echo "string:".$item."<br>"; } }); var_dump($arr);
额,下午执行代码还是正确的,现在执行,居然结果不再是期望的一维数组。明天再检查一下,是php版本导致的还是眼睛花了。
$arr = array( "hello", "world", ["wind", "rain"], "elephant", "snake", ["East", "west"] );