Cakephp 为什么我不能用Collection::reduce()获得与foreach相同的结果?
我很难理解CakePHP的集合::reduce。事实上,我感觉我理解它应该如何工作,但实际上它的工作方式似乎有所不同。我有一个实体集合,根据另一个数组的内容,我试图从中提取一些字符串。数组有一个ID,集合有一个ID作为一种外部ID。我循环数组,然后在每个循环中循环集合,以查找具有与数组中的ID匹配的外部ID的实体。使用Collection::reduce实现这一点与使用两个foreach()循环实现结果截然不同。不管怎样,代码如下:Cakephp 为什么我不能用Collection::reduce()获得与foreach相同的结果?,cakephp,collections,foreach,cakephp-3.0,reduce,Cakephp,Collections,Foreach,Cakephp 3.0,Reduce,我很难理解CakePHP的集合::reduce。事实上,我感觉我理解它应该如何工作,但实际上它的工作方式似乎有所不同。我有一个实体集合,根据另一个数组的内容,我试图从中提取一些字符串。数组有一个ID,集合有一个ID作为一种外部ID。我循环数组,然后在每个循环中循环集合,以查找具有与数组中的ID匹配的外部ID的实体。使用Collection::reduce实现这一点与使用两个foreach()循环实现结果截然不同。不管怎样,代码如下: public function reducetest() {
public function reducetest() {
$this->render('test');
$groupby = ['a' => 1, 'b' => 2];
$array = [
array('id' => 'b', 'title' => 'array_tag_1'),
array('id' => 'a', 'title' => 'array_tag_2'),
array('id' => 'b', 'title' => 'array_tag_3'),
array('id' => 'a', 'title' => 'array_tag_4'),
array('id' => 'a', 'title' => 'array_tag_5')
];
$array_result = array();
foreach ($groupby as $key => $value) {
$array_result[$key] = '';
foreach ($array as $item) {
if ($key === $item['id']) {
// debug($array_result[$key] . $item['title'] . ", \n");
$array_result[$key] .= $item['title'] . ', ';
}
}
$array_result[$key] = trim($array_result[$key], ', ');
}
debug($array_result);
$collection = new Collection([
array('id' => 'b', 'title' => 'collection_tag_1'),
array('id' => 'a', 'title' => 'collection_tag_2'),
array('id' => 'b', 'title' => 'collection_tag_3'),
array('id' => 'a', 'title' => 'collection_tag_4'),
array('id' => 'a', 'title' => 'collection_tag_5')]
);
$collection_result = array();
foreach ($groupby as $key => $value) {
$collection_result[$key] = $collection->reduce(function ($string, $item) use ($key) {
if ($key === $item['id']) {
// debug($string . $item['title'] . ", \n");
return $string . $item['title'] . ', ';
}
}, '');
$collection_result[$key] = trim($collection_result[$key], ', ');
}
debug($collection_result);
}
带有两个foreach()循环的代码会产生预期的结果:
[
'a' => 'array_tag_2, array_tag_4, array_tag_5',
'b' => 'array_tag_1, array_tag_3'
]
使用reduce函数的代码给出了这样一个结果——对我来说,这是不可理解的:
[
'a' => 'collection_tag_4, collection_tag_5',
'b' => ''
]
你能给我解释一下我没有得到什么吗