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

时间:2015-03-17 13:35:14

标签: php loops 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']),我想从第一个数组中删除完整的嵌套数组。所以在第一个数组中只有第3个[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
            )

    )

3 个答案:

答案 0 :(得分:1)

看看this回答。我认为它完全符合你的需要。

答案 1 :(得分:0)

你可以通过多种方式解决这个问题。这是我认为非常简单的一个。

首先,根据$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

答案 2 :(得分:0)

这是我自己的工作解决方案

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;
            }
        }

    }