我有一个集合,我在该集合上使用where
方法以仅获取匹配的元素,如下所示:
myCollection->where('akey', $value);
当我尝试使用filter方法对其进行转换时,它失败了:
myCollection->filter(function($value, $key){
if($key === 'akey' && $value === $aValue)
return true;
});
我尝试使用过滤器,因为如果它们的值等于多个值,我想选择集合中的项。 (基本上在哪里,在哪里,在哪里,在哪里)。
答案 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
)
)