Cakephp 为什么我不能用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() {

我很难理解CakePHP的集合::reduce。事实上,我感觉我理解它应该如何工作,但实际上它的工作方式似乎有所不同。我有一个实体集合,根据另一个数组的内容,我试图从中提取一些字符串。数组有一个ID,集合有一个ID作为一种外部ID。我循环数组,然后在每个循环中循环集合,以查找具有与数组中的ID匹配的外部ID的实体。使用Collection::reduce实现这一点与使用两个foreach()循环实现结果截然不同。不管怎样,代码如下:

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' => ''
]
你能给我解释一下我没有得到什么吗