匿名PHP函数,in_array不起作用

时间:2014-11-20 22:59:38

标签: php arrays

我在PHP中有这个简单的数组$tree,我需要根据与数组中匹配的标记数组进行过滤。

Array
(
    [0] => stdClass Object
        (
            [name] => Introduction
            [id] => 798162f0-d779-46b6-96cb-ede246bf4f3f
            [tags] => Array
                (
                    [0] => client corp
                    [1] => version 2
                )
        )

    [1] => stdClass Object
        (
            [name] => Chapter one
            [id] => 761e1909-34b3-4733-aab6-ebef26d3fcb9
            [tags] => Array
                (
                    [0] => pro feature
                )
        )
)

我尝试使用像这样的匿名函数:

$selectedTree = array_filter($tree, function($array) use ($selectedTags){
   return in_array($array->tags, $selectedTags, true);
});

$ selectedTags:

Array
(
    [0] => client corp
)

当我希望返回第1项时,上面的内容将返回空白。没有错误抛出。我错过了什么?

2 个答案:

答案 0 :(得分:2)

如果是in_array($neddle, $haystack)$neddle必须是String,但您提供的数组就是其行为不正常的原因。

但是如果您想将数组作为$selectedTags的值传递,那么您可以尝试下面的内容:

$selectedTree = array_filter($tree, function($array) use ($selectedTags){
   return count(array_intersect($array->tags, $selectedTags)) > 0;
});

参考:array_intersect

答案 1 :(得分:2)

如果我正确地阅读了这个问题,你需要查看$tree数组中的每个对象,看看tags属性是否包含$selectedTags

中的任何元素

这是一种程序化的方法。

$filtered = array();
foreach ($tree as $key => $obj) {
    $commonElements = array_intersect($selectedTags, $obj->tags);
    if (count($commonElements) > 0) {
        $filtered[$key] = $obj;
    }
}

我还要发布这样做的功能方法但是,请参阅codeparadox对该实现的回答。