我有两个数组,它们的键为“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 填充,基本上,如果我删除一个类别,那么我会将子类别移动到与我要删除的类别相同的级别。
但是,如果任何子项与删除类别 sibling 之一具有相同的 menu_title,那么我需要将子项的 menu_title 重命名为“whatever-1”,例如“计算机-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 键。
有什么想法吗?
最佳答案
本质上这是 O(m*n),其中 m 和 n 是两个数组的大小 - 所以你不能做得更好。最后,您需要查看每个(兄弟、子)对,除非您可以更具体地了解这些数组的填充方式,否则没有太大的改进空间。
可能需要进行一些调整来优化这一点,但我并没有立即想到,而且可能没有任何东西会产生显着的差异。
编辑:如果您对两个数组进行排序,首先是 O(n*log n + m*log m),那么您可能可以根据数组中的实际内容进行一些渐近改进。除非数组相当大,否则这可能没有用。
关于php - 比较多维数组中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12071148/