【问题标题】:Unset Values from an Array that Match another Array从与另一个数组匹配的数组中取消设置值
【发布时间】:2018-07-25 09:31:04
【问题描述】:

确保匹配 $config['a'] 的值不在 $config['b'] 中设置的最快和最有效的方法是什么?

在这种情况下,周日 14 应该从 $config['b']['Hours']['Sunday'] 中取消设置

$duplicates = array_intersect($config['a']['Hours'], $config['b']['Hours']);

给我一​​个错误,“注意:数组到字符串的转换”,以及不正确的结果,所以要么我的数组构造不正确,要么我的方法不正确。

这是数组;

    $config  =  array(
                "a" => array(
                    "Hours" => array(
                        "Sunday" => array(12,13,14,15,16),
                    ),
                ),
                "b" => array(
                    "Hours" => array(
                        "Sunday" => array(0,1,2,3,4,5,6,7,8,9,10,11,14,17,18,19,20,21,22,23),
                        "Monday" => array(0,1,2,3,4,5,19,18,19,20,21,22,23),
                        "Tuesday" => array(0,1,2,3,4,5,19,18,19,20,21,22,23),
                        "Wednesday" => array(0,1,2,3,4,5,19,18,19,20,21,22,23),
                        "Thursday" => array(0,1,2,3,4,5,19,18,19,20,21,22,23),
                        "Friday" => array(0,1,2,3,4,5,19,18,19,20,21,22,23),
                        "Saturday" => array(0,1,2,3,4,5,8,19,20,21,22,23,24),
                    ),
                ),
            );

【问题讨论】:

    标签: php arrays multidimensional-array array-intersect


    【解决方案1】:

    要从数组中删除 b 值,在相应的 'a' 中显示,使用 array_diff 函数

    foreach($config['a']["Hours"] as $k => $v) { 
          $config['b']["Hours"][$k] = array_diff( $config['b']["Hours"][$k], $v);
        }
    

    【讨论】:

    • 如果$config['b']["Hours"][$k] 不存在可能会有问题。虽然,如果b 数组总是包含所有键,那不是问题。
    • 我猜它包含。如果不是这样,我希望 OP 添加一个检查
    【解决方案2】:

    array_intersect 不能递归工作,如文档中所述:https://secure.php.net/array_intersect

    它将值作为字符串进行迭代和比较,因此出现错误,因为它尝试将值 array(12,13,14,15,16) 用作字符串并失败。

    在您的情况下,正确的方法是首先使用 array_keys() 比较密钥,然后对于存在的密钥使用 array_intersect()array_diff()

    编辑:

    这个例子应该以期望的方式工作:

    $duplicateKeys = array_intersect(array_keys($config['a']['Hours']), array_keys($config['b']['Hours']));
    $duplicates = [];
    
    if(!empty($duplicateKeys) && is_array($duplicateKeys)) {
        foreach($duplicateKeys as $key) {
            $duplicates[$key] = array_intersect($config['a']['Hours'][$key], $config['b']['Hours'][$key]);
        }
    }
    

    【讨论】:

    • 聪明的草皮!效果很好,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 2013-11-10
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多