项目中需要将数据报表的结果缓存起来,搜索条件比较多,每个条件又有几十到几百个选项,需要一个工具对搜索条件进行枚举,自己动手写了一个。
/**
* @author murphy v2017/12/28
* 不确定字段数目搜索条件枚举函数
* 使用生成器进行迭代,防止一次性返回数组体积过大导致内存溢出
* @param $params array ['keword1'=>['value1','value2'...],'keyword2'=>[]...]
* @return Generator
*/
function queryBuilder($params)
{
$set = [];//需要返回的参数组合
$paramCount = [];//目标组合长度
$setCount = 1;
$paramNames = array_keys($params);
foreach ($params AS $k => $v) {
$paramCount[$k] = count($v);
if (!empty($v)) {
$setCount *= $paramCount[$k];
}
}
while ($setCount > 0) {
foreach ($paramNames AS $k => $paramName) {
$set[$setCount][$paramName] = current($params[$paramName]);
//如果数据为第一列或前一组数组的游标在末尾
if ($k == 0 || key($params[$paramNames[$k - 1]]) == ($paramCount[$paramNames[$k - 1]] - 1)) {
if (key($params[$paramName]) == $paramCount[$paramName] - 1) {
reset($params[$paramName]);
} else {
next($params[$paramName]);
}
}
}
yield $set[$setCount];
$setCount--;
}
}