如何访问 Collection 中的项目

How to access item in a Collection

我有两个collection。

首先 Collection 是根项目的所有后代(不是 children),扁平结构,换句话说,我的数据库中扁平组织中的所有项目:

$descendants = $root->getDescendants();

我通过这个 collection 使用 foreach:

foreach ($descendants as $key => &$item) {}

对于每个项目,我都做了一些魔法,但是,我需要将这个魔法只投射到这个项目的后代(而不是 children)(它是 $descendants 项目的子集,相同的项目!)。

我继续,得到了sub-descendants:

$itemDescendants = $item->getDescendants();
foreach ($itemDescendants as $key => &$item) {
    //modify $item, but in $descendants Collection
}

我知道,第一个 foreach 中的 $key !== 第二个 foreach 中的 $key。

如何在 $descendants Collection 中访问 $item(并获取其 $key)进行编辑,意思是,我直接在 $descendants Collection 中更改属性,我 return 在函数末尾?

我需要来自$descendants 的$item 的$key,这样我就可以直接在$descendants 中修改它:

$descendants[$key]->user_permissions = array();

我查看了 Laravel Documentation,最接近的是搜索,但不起作用:

$childItem = $descendants->search($item);

完整代码如下所示:

$descendants = $root->getDescendants();
foreach ($descendants as $key => &$item) {
    $itemDescendants = $item->getDescendants();

    foreach ($itemDescendants as $key => &$childItem) {

        $mainChildItem = $descendants->search($childItem); //I would need to get a key ($childKey), not item..
        $user_permissions = array();
        //check if permissions are already set
        if(!empty($mainChildItem->permissions)){
            $permissions = $mainChildItem->permissions;
        }

        $user_permissions['all'] = ($user_permissions['all'] !== 0) ? $contentPermission['all'] : $user_permissions['all'];
        $user_permissions['view'] = ($user_permissions['view'] !== 0) ? $contentPermission['view'] : $user_permissions['view'];

        $descendants[$childKey]->user_permissions = array(); //missing $childKey
    }

}
return $descendants;

现在,可能不是最佳解决方案,我遍历 $descendants 并将键保存在 item->id 索引上:

foreach($descendants as $key=>$item){
    $descendantsKeys[$item->id] = $key;
}

当我想访问 $descendants 中的特定项目时,我使用这个数组来搜索键。

$itemKey = $descendantsKeys[$childItem->id];

然后将此项目保存在 main Collection $descendants:

$descendants[$itemKey]->user_permissions = array();

我打赌有更好的方法,但需要继续开发..