我有以下多维数组。
$arr = array(
0 => array(
'id' => 1,
'title' => 'title1',
'url' => 'http://www.foo.bar/',
'blurb' => 'blurb1',
'custodian' => 'custodia1',
'tags' => 'tag1',
'active' => 'Y',
),
1 => array(
'id' => '2',
'title' => 'title2',
'url' => 'http://www.foo.bar/',
'blurb' => 'blurb2',
'custodian' => 'custodia2',
'tags' => 'tag1,tag2',
'active' => 'Y',
),
2 => array(
'id' => '3',
'title' => 'title3',
'url' => 'http://www.foo.bar/',
'blurb' => 'blurb3',
'custodian' => 'custodia3',
'tags' => 'tag1,tag2,tag3',
'active' => 'Y',
),
);
我需要过滤数组,以便只显示标签值中带有“tag2”的数组。
我看过array_filter
但是我无法理解它。
这是我的尝试,但根本不起作用。不知道我做错了什么。
$filterArr = array_filter($arr, function($tag) {
return ($tag['tags'] == 'tag2');
});
答案 0 :(得分:2)
最简单的方法是使用foreach循环并在循环体中检查'tag2'
如果您需要删除标签中没有tag2的所有行,您可以使用下一个循环:
foreach ($arr as $key => $value) {
if (!preg_match('/\btag2\b/',$value['tags'])) {
unset($arr[$key]);
}
}
答案 1 :(得分:2)
array_filter获取数组的每个元素并将其传递给指定的函数,在该函数中,您需要返回true或false,如果它应该保留,则为true;如果应该将其过滤掉,则为false
使用explode
和in_array
检查tag2
$filteredArray = array_filter($arr, "filterTag");
function filterTag($arrayElement) {
return in_array("tag2",explode(",",$arrayElement["tags"]));
}
您的尝试不起作用,因为您的某些“标记”包含除tags2
之外的其他字词,例如tag1,tag2,tag3
执行简单的==
比较不会在字符串中搜索其他字符串
答案 2 :(得分:2)
您可以使用array_filter并提供正确的回调
$result = array_filter($arr,function($t){
return in_array('tag2',explode(',',$t['tags']));
});
答案 3 :(得分:0)
$resultArr = array();
foreach($arr as $curr)
{
$tagsData = explode(',',$curr['tags']);
if(in_array('tag1',$tagsData)
$resultArr[] = $curr;
}
$ resultArr是包含带有tag1
标签的数组的结果数组