php - 比较多维数组中的值

标签 php arrays multidimensional-array

我有两个数组,它们的键为“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/

相关文章:

c# - 将字符串的一部分放入数组

python - Numpy 将 3 维数组索引为 2 维数组

php - 从不同的表 PHP 返回数组

php - 使用 jQuery 和 PHP 在 div 中循环显示 JSON 数据

arrays - 将数组名称传递给函数,然后填充它

java - 使用 foreach 循环更改二维数组中的值

java - 存储二维数组并稍后在 Java 中再次调用它们

php - Laravel 5.3 资源 : change action

php - 在数据库中存储 MySQL 查询 (MySQL)

javascript - 循环是否会导致分支预测