我不确定即使在这里我也使用正确的术语,但是我会尽力解释。我正在使用PHP的array_filter函数来过滤产品,它会回调到我在添加过滤器的地方创建的自定义函数。我可以很容易地对它进行硬编码,但是我显然希望它是动态的:
长话短说,自定义过滤器函数返回array_filter()函数,如下所示:
return ($arr['colour']=='Red' || $arr['colour']=='White');
如果像上面这样进行硬编码,这可以很好地工作,并且可以按预期过滤数组以仅显示红色或白色的产品。但是,我需要保持动态。
那么,如何构造一个值字符串,然后在return语句中使用它呢?
例如:
$var = "$arr['colour'] == 'Red' || $arr['colour'] == 'White'";
return ($var);
这没用。我尝试使用eval()(无论如何我都不想使用它!),它仍然无法正常工作。
我有一个循环,如下所示从数组构造字符串:
// $value=array of filters e.g colour=Black, colour=Red
$filterparts = explode("=", $value);
$filters[] = '$arr[\'' . $filterparts[0] . '\'] == \'' . $filterparts[1] . '\'';
// Creates array e.g $arr['colour'] = 'Red'
$imploded_filter = implode(" || ", $uniquefilters);
// Creates string, e.g. $arr['colour'] = 'Red' || $arr['colour'] = 'White'
因此,如果我回显$ imploded_filter,我将获得返回的提取字符串:
echo $imploded_filter;
// Outputs $arr['colour'] = 'Red' || $arr['colour'] = 'White'
但是如果我这样做
return($imploded_filter);
显然不是将字符串作为硬代码来评估,那我该怎么办?我是否需要对字符串做一些事情或以不同的方式返回它,或者以完全不同的方式构造需要返回的代码?
数组键可以动态指定。不需要eval()
:
$value = $array[$key];
您可以构建一个过滤器列表,并在array_filter()
回调中将它们匹配:
$filters = array(
array('colour', array('white', 'blue')), // Multiple accepted values (OR)
array('material', 'Fine Bone China'), // Single accepted value
);
$filtered = array_filter($products, function ($item) use ($filters) {
// Match all filters
foreach ($filters as $filter) {
// Detect multi-value filter
$isArrayFilter = is_array($filter[1]);
if (
// Check if multi-value filter doesn't match
$isArrayFilter && !in_array($item[$filter[0]], $filter[1])
// Check if a single-value filter doesn't match
|| !$isArrayFilter && $item[$filter[0]] != $filter[1]
) {
// Filter doesn't match - exclude the item
return false;
}
}
// All filters match - include the item
return true;
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句