【发布时间】: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