TL;DR:为什么 Doctrine 的 ArrayCollection 只支持映射数组而不设置键?

我想从我的 Doctrine 实体创建一个关联数组(键-> 值):即 customerId => CustomerNameuserId => userName 等。创建关联数组不是火箭科学,所以有很多其他方法可以实现这一点。

但是,我仍然想知道为什么 ArrayCollection:map(或类似方法)没有执行此操作的选项。它的构造函数方法和 ArrayCollection::set() 支持使用键创建数组。你甚至可以像这样创建一个数组:

$arraycollection = new ArrayCollection();
$arraycollection->add('John Doe');
$arraycollection->set('foo', 'bar');
$arraycollection->set(418, 'teapot');

但是你不能用 ArrayCollection::map() 设置键。为什么?我是第一个正在寻找这样的功能的开发人员(不太可能)还是我错过了一个重要的原则,使它变得不必要、不可能、不受欢迎或不好的做法?

最佳答案

我在 Adam Wathan 的博客 Customizing Keys When Mapping Collections 中找到了这个答案:



他使用 Laravel 的 Collection 库:

$emailLookup = $employees->reduce(function ($emailLookup, $employee) {
    $emailLookup[$employee['email']] = $employee['name'];
    return $emailLookup;
}, []);

这正是我想使用的解决方案,但它不在 Doctrine 的 ArrayCollection 中。由于向后兼容,已关闭用于添加 reduce() 方法的 pull request

感谢 this example ,您可以基于 Doctrine 的 ArrayCollection 实现自己的类:
use Doctrine\Common\Collections\ArrayCollection;

class ExtendedArrayCollection extends ArrayCollection
{
    /**
     * Reduce the collection into a single value.
     *
     * @param \Closure $func
     * @param null $initialValue
     * @return mixed
     */
    public function reduce(\Closure $func, $initialValue = null)
    {
        return array_reduce($this->toArray(), $func, $initialValue);
    }
}

关于php - 使用 ArrayCollection::map 创建关联数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36955808/

10-14 15:02