Laravel集合,用filter方法替换where方法

时间:2018-10-24 10:08:18

标签: php laravel

我有一个集合,我在该集合上使用where方法以仅获取匹配的元素,如下所示:

myCollection->where('akey', $value);

当我尝试使用filter方法对其进行转换时,它失败了:

myCollection->filter(function($value, $key){
   if($key === 'akey' && $value === $aValue)
      return true;
});

我尝试使用过滤器,因为如果它们的值等于多个值,我想选择集合中的项。 (基本上在哪里,在哪里,在哪里,在哪里)。

2 个答案:

答案 0 :(得分:5)

我假设$aValue是在filter函数之外定义的,您应该像这样将其传递给回调函数:

myCollection->filter(function($value, $key) use ($aValue) {
  if($key === 'akey' && $value === $aValue)
      return true;
});

-编辑-

根据您的示例,我认为这应该可行。

myCollection->filter(function($item) use ($aValue) {
   return $item->aKey === $aValue;
});

答案 1 :(得分:0)

我编写了一个简单的PHP脚本来描述您的问题,请查看内联注释以获取详细信息。

<?php

require __DIR__ . '/vendor/autoload.php';

use Illuminate\Support\Collection;

$data = [
    [
        'akey' => 'the answer',
        'avalue' => 'vote up',
    ],
];

$filterKey = 'the answer';

$c = new Collection($data);
$c = $c->filter(function($val, $key) use ($filterKey) {
    var_dump($key); // $key is indexed number, It will output "int(0)"
    // return $key == $filterKey; // XXX Here is problem, Try to comment out to see the different.
    return $val['akey'] == $filterKey; // Get value from $val, which is associative array. 
});

print_r($c->all());

输出:

/Users/gasolwu/Code/laravel/demo.php:18:
int(0)
Array
(
    [0] => Array
        (
            [akey] => the answer
            [avalue] => vote up
        )

)