所以,我有三个这样的数组:
[items] => Array
( [0] => Array
(
[id] => someid
[title] => sometitle
[author] => someauthor
...
)
...
)
以及一个用逗号分隔的单词到黑名单的字符串:
$blacklist = "some,words,to,blacklist";
现在我需要将这些单词与 id,title , author 匹配,并相应地显示结果。
我在想这样一个函数:
$pattern = '('.strtr($blacklist, ",", "|").')'; // should return (some|words|etc)
foreach ($items as $item) {
if ( !preg_match($pattern,$item['id']) || !preg_match($pattern,$item['title']) || !preg_match($pattern,$item['author']) )
{
// show item
}
}
我想知道这是否是过滤数组的最有效方法,或者我应该使用 strpos()或 filter_var 与FILTER_VALIDATE_REGEXP ...
请注意,每3个数组重复此功能。但是,每个数组不会包含超过50个项目。
答案 0 :(得分:3)
你的不错。我通常会使用strpos
来做这样的事情......
$items = filter($foo['items'], array('some','words','to','blacklist'));
function filter($items, $blacklist) {
$filtered = array();
foreach($items as $item) {
foreach($item as $key => $value) {
$pass = true;
foreach($blacklist as $filter) {
$pass = strpos($value, $filter) === false;
if(!$pass) break;
}
if($pass) $filtered[] = clone($item);
}
}
return $filtered;
}
要添加更多复杂性,您可以通过空格标记您正在检查的字符串。然后代码将成为:
function filter($items, $blacklist) {
$filtered = array();
foreach($items as $item) {
foreach($item as $key => $value) {
$pass = true;
foreach(explode(' ', $value) as $word) {
$pass = !in_array($word, $blacklist);
if(!$pass) break;
}
if($pass) $filtered[] = clone($item);
}
}
return $filtered;
}