文章大纲

laravel中如何将二维数组处理成where条件

2019-12-05 12:36:47

公司有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"]
);



我要评论
评论列表