为什么我不能像使用foreach那样使用Collection :: reduce()获得相同的结果?

时间:2015-09-20 12:01:33

标签: cakephp collections foreach cakephp-3.0 reduce

我在CakePHP的Collection :: 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' => ''
]

你能告诉我我没有来这里吗?

0 个答案:

没有答案