我不确定我是否正在使用正确的术语,但我会尝试解释,我使用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);
它显然没有将字符串作为硬代码进行评估,所以我能做什么,是否需要对字符串执行某些操作或以不同的方式返回它,或构造我需要以完全不同的方式返回的代码?
感谢您的帮助!
答案 0 :(得分:0)
$colors = ['Red', 'White'];
$products = array_filter($products, function ($product) use ($colors) {
return in_array($product['color'], $colors);
});
几乎没有任何理由或需要“动态创建PHP源代码”。总有一个操作可以在任意数量的元素上执行您想要的操作,而无需连接||
运算符。这里in_array
是一个非常好的函数来测试一个值对许多人。您可以使用use ($colors)
动态传递colors数组。
古老PHP版本的最佳解决方法是使用类近似匿名回调:
class InArrayFilterCallback {
public $data = array();
public $key;
public __construct($data, $key) {
$this->data = $data;
$this->key = $key;
}
public callback($item) {
return in_array($item[$this->key], $this->data);
}
}
$products = array_filter($products, array(new InArrayFilterCallback($colors, 'color'), 'callback'));
当然,您也可以使用简单的foreach
循环代替......
答案 1 :(得分:0)
可以动态指定数组键。不需要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;
});
答案 2 :(得分:0)
为什么不使用in_array
函数,如下所示:
$filters = [
'colour' => [
'red',
'blue',
]
];
array_filter($list, function ($item) use ($filters) {
foreach ($filters as $index => $filter) {
if (!in_array($item[$index], $filter)) {
return false;
}
}
return true;
});
制作字符串并评估它并不是一个好主意