如果多维数组中存在相同的值,则从另一个多维数组中删除数组


Remove array from a multidimensional array if the same value exists in another multidimensional array

>我有两个数组,比如

Array
(
    [0] => Array
        (
            [id] => 1
            [controller] => users
            [action] => index
        )
    [1] => Array
        (
            [id] => 1
            [controller] => users
            [action] => 
        )
    [2] => Array
        (
            [id] => 1
            [controller] => users
            [action] => login
        )
)
Array
(
    [0] => Array
        (
            [id] => 1
            [controller] => users
            [action] => index
        )
    [1] => Array
        (
            [id] => 1
            [controller] => users
            [action] => 
        )
    [2] => Array
        (
            [id] => 1
            [controller] => users
            [action] => logout
        )
)

如果在第二个数组中找到匹配项,我想从第一个数组中删除完整的嵌套数组(基于键 ['controller'] &&['action'])。因此,在第一个数组中,只有第三个 [2] 数组是唯一的。

输出应如下所示:

Array
    (
        [0] => Array
            (
                [id] => 1
                [controller] => users
                [action] => login
            )
    )

请注意请注意,第二个数组不必与第一个数组的顺序相同。与我的问题相反,每个数组的前两个数组是相同的。

我尝试的是:

$result = array();
for($i=0; $i < count($a); $i++)
{
    $result[] = array_diff($a[$i], $b[$i]);
}
print_r($result); // This doesn't give required output. It removes every thing and return like 

Array
    (
        [0] => Array
            (
            )
        [1] => Array
            (
            )
        [2] => Array
            (
                [action] => login
            )
    )

看看这个答案。我认为它会完全满足您的需求。

有很多方法可以做到这一点。这是一个我认为非常简单的。

首先,基于 $a 设置一个新数组,通过控制器和操作属性对其进行索引。

$final = array();
foreach($a AS $item) {
    $final[$item['controller'] . $item['action']] = $item;
}

现在,您可以遍历第二个数组,删除任何匹配的项。

foreach($b AS $item) {
    unset($final[$item['controller'] . $item['action']]);
}

现在$final应该是您想要的数组。

工作示例:http://3v4l.org/JtUkN

这是我

自己的工作解决方案

for($i=0; $i < count($data); $i++)
    {
        foreach($this->existing_data as $v)
        {
            if( ($v['controller'] == $data[$i]['controller']) && ($v['action'] == $data[$i]['action']) )
            {
                unset($data[$i]);
                break;
            }
        }
    }