【问题标题】:How to access item in a Collection如何访问集合中的项目
【发布时间】:2021-11-27 13:45:16
【问题描述】:

我有两个收藏。

第一个集合是根项、平面结构的所有后代(不是子项),换句话说,我的数据库中的所有项都是平面组织:

$descendants = $root->getDescendants();

我使用 foreach 浏览了这个集合:

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

对于每个项目,我都做了一些魔法,但是,我需要将这个魔法只投射到这个项目的后代(不是孩子)(它是 $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 中更改属性,并在函数结束时返回?

我需要一个来自 $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;

【问题讨论】:

  • 你能展示你尝试过的完整代码,看看你是如何封装foreach循环的吗?从我正在阅读的内容来看,这似乎非常简单,但这可能是因为我不了解两个循环之间的上下文。
  • 我已将完整代码编辑到 OP 中。
  • 但是在您的第一个循环中,您循环遍历后代并将单个后代定义为 $item,这仍然可以在下一个 foreach 循环中访问,因此您可以执行 $item = ->user_permissions = array( );还假设后代是一个对象,那么没有理由将其定义为引用,因为对象始终是引用
  • 关于对象的引用是正确的,但我试图访问同一集合中的对象,但我只从第二个集合 $itemDescendants 中知道它们。我没有从 $descendants 修改 $item ,但 $descendants 中的项目,在 $itemDescendants 中列出。
  • 好吧,我想我明白了。因此子对象将与后代对象相同,但您现在没有该位置。它们都是 Laravel 模型吗?

标签: php laravel foreach collections key


【解决方案1】:

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

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

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

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

然后将此项目保存在主集合 $descendants 中:

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

我打赌有一个更优化的方法,但需要继续开发..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    相关资源
    最近更新 更多