Hi!
I'm having trouble wrapping my head around Collection::reduce. Actually, it
feels like I understand how it's supposed to work, but in reality it seems
to work differently. I have a collection of entities, from which I'm trying
to concat a number of string, based on another array (could probably also
be an array, I don't think it would matter much). The array has an ID, the
collection has that ID as a foreign ID. I loop through the array, and then
in each loop I loop through the collection to find the entities which have
a foreign ID matching the ID from the array. Implementing this with
Collection::reduce gives a wildly different result from doing it with two
foreach() loops. Anyway, here's the code:
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);
}
The code with the two foreach() loops produces this result, as expected:
[
'a' => 'array_tag_2, array_tag_4, array_tag_5',
'b' => 'array_tag_1, array_tag_3'
]
The code that uses the reduce function gives this result, incomprehensibly
to me:
[
'a' => 'collection_tag_4, collection_tag_5',
'b' => ''
]
Who can explain to me what I'm not understanding here?
--
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP
---
You received this message because you are subscribed to the Google Groups
"CakePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/cake-php.
For more options, visit https://groups.google.com/d/optout.