我在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' => ''
]
你能告诉我我没有来这里吗?