根据两个值删除多维数组中的元素


remove elements in multidimensional array based on two values

在我的示例中,我在 5 个法院的特定日期和时间有 2 个法院预订数组,包括日期、法院编号、成员和类型。我想从第一个数组中有匹配日期/法院的第二个数组中删除项目。

这是一个时间段。 第一个数组显示此时间段中的 2 个预订。

Array
(
[0] => Array
    (
        [0] => Jul 6, 2014 7:00 AM
        [1] => 1
        [2] => Annie
        [3] => Regular
    )
[1] => Array
    (
        [0] => Jul 6, 2014 7:00 AM
        [1] => 3
        [2] => Meredith
        [3] => Regular
    )
)        

第二个数组是该日期/时间上所有可用的时隙。

Array
(
[2] => Array
    (
        [0] => Jul 6, 2014 7:00 AM
        [1] => 1
        [2] => 
        [3] => UNBOOKED
    )
[3] => Array
    (
        [0] => Jul 6, 2014 7:00 AM
        [1] => 2
        [2] => 
        [3] => UNBOOKED
    )
[4] => Array
    (
        [0] => Jul 6, 2014 7:00 AM
        [1] => 3
        [2] => 
        [3] => UNBOOKED
    )
[5] => Array
    (
        [0] => Jul 6, 2014 7:00 AM
        [1] => 4
        [2] => 
        [3] => UNBOOKED
    )
[6] => Array
    (
        [0] => Jul 6, 2014 7:00 AM
        [1] => 5
        [2] => 
        [3] => UNBOOKED
    )
)

我想做的是删除第二个数组中与元素 [0] 和 [1] 匹配的项目。 我尝试过的每个解决方案都只是在数组中搜索字符串,而不是另一个数组。理想情况下,结果如下所示(外部数字键对我来说并不重要)。

Array
(
    [0] => Array
        (
            [0] => Jul 6, 2014 7:00 AM
            [1] => 1
            [2] => Annie
            [3] => Regular
        )
    [1] => Array
        (
            [0] => Jul 6, 2014 7:00 AM
            [1] => 3
            [2] => Meredith
            [3] => Regular
        )
    [3] => Array
        (
            [0] => Jul 6, 2014 7:00 AM
            [1] => 2
            [2] => 
            [3] => UNBOOKED
        )
    [5] => Array
        (
            [0] => Jul 6, 2014 7:00 AM
            [1] => 4
            [2] => 
            [3] => UNBOOKED
        )
    [6] => Array
        (
            [0] => Jul 6, 2014 7:00 AM
            [1] => 5
            [2] => 
            [3] => UNBOOKED
        )
)

这就是使用数组筛选器删除预订时间列表中存在的可用时间列表中的条目的方式。

您可以在此处看到此操作: http://codepad.viper-7.com/VVbnys

$regular = Array(
            0 => Array (
                    0 => 'Jul 6, 2014 7:00 AM',
                    1 => 1,
                    2 => 'Annie',
                    3 => 'Regular',
                ),
            1 => Array (
                    0 => 'Jul 6, 2014 7:00 AM',
                    1 => 3,
                    2 => 'Meredith',
                    3 => 'Regular',
                )
            );
$unbooked = Array (
            2 => Array
                (
                    0 => 'Jul 6, 2014 7:00 AM',
                    1 => 1,
                    2 => '',
                    3 => 'UNBOOKED',
                ),
            3 => Array
                (
                    0 => 'Jul 6, 2014 7:00 AM',
                    1 => 2,
                    2 => '',
                    3 => 'UNBOOKED',
                ),
            4 => Array
                (
                    0 => 'Jul 6, 2014 7:00 AM',
                    1 => 3,
                    2 => '',
                    3 => 'UNBOOKED',
                ),
            5 => Array
                (
                    0 => 'Jul 6, 2014 7:00 AM',
                    1 => 4,
                    2 => '',
                    3 => 'UNBOOKED',
                ),
            6 => Array
                (
                    0 => 'Jul 6, 2014 7:00 AM',
                    1 => 5,
                    2 => '',
                    3 => 'UNBOOKED',
                ),
            );
//filter the unbooked array
$unbooked = array_filter($unbooked, function($availSlot) use ($regular){
    //loop over each taken slot
    foreach($regular as $takenSlot){
        //if keys 0 and 1 are the same in both taken and available...
        if($availSlot[0] == $takenSlot[0] && $availSlot[1] == $takenSlot[1]){
            //return false to remove this element from the array
            return false;
        }
    }
    //if we get here, no matches were found.
    //return true so the element stays in the array
    return true;
});

理想情况下,格式将更改为多维数组,允许您将内容嵌套在可用的时隙和数字下,而无需遍历每个条目以查找匹配的条目。