我有两个具有键“menu_title”和“id”的数组。
我想遍历这两个数组并将第一个数组中与第二个数组中的数组共享“menu_title”的任何数组的 id 存储在第三个数组中。
我知道我可以这样做:
$collision = [];
foreach($children as $child)
foreach($siblings as $sibling)
if($child['menu_title'] == $sibling['menu_title'])
$collision[] = $child['id'];
但这意味着我要为第一个中的每个项目循环第二个数组。
也许这会更好?
$collision = [];
foreach($siblings as &$sibling)
$sibling = $sibling['menu_title'];
foreach($children as $child)
if(in_array($child['menu_title'], $siblings))
$collision[] = $child['id'];
但我仍然认为必须有更好的方法?
更新
数组由 sql 填充,基本上如果我删除一个类别,那么我会将子类别移动到与我要删除的类别相同的级别。
但是,如果任何孩子的 menu_title 与删除类别兄弟姐妹之一相同,那么我需要将孩子的 menu_title 重命名为“whatever-1”,例如“computers-1”
所以我正在构建一个我需要更新的 id 数组,然后我将对这些 ID 进行 sql 更新,可能对我如何处理这个问题进行改进?
更新
所以,最后我得到了:
$id = 4;
$category = $this->categoryeditormodel->getCategory($id);
$children = $this->categoryeditormodel->getChildCategories($id);
$siblings = $this->categoryeditormodel->getSiblingCategories($id);
foreach($siblings as &$sibling)
$sibling = $sibling['menu_title'];
foreach($children as &$child){
$child['parent_id'] = $category['parent_id'];
if(in_array($child['menu_title'], $siblings)){
$i = 0;
while(in_array(($name = ($child['menu_title'].'-'.++$i)), $siblings));
$child['menu_title'] = $name;
}
}
$this->categoryeditormodel->update_batch($children);
顶部的三个函数按照他们说的做,但它们很便宜,因为类别已经加载到缓存中,所以它不是另一个 sql 查询。
update_batch 只是 Code Igniters update_batch 函数的快捷方式,但它通过表名和 id 键传递。
有什么想法吗?