【问题标题】:How to get the difference of two multidimensional arrays in php?如何在php中获取两个多维数组的差异?
【发布时间】:2016-05-01 08:59:31
【问题描述】:

我想得到两个多维数组的差异,例如,

第一个数组:

Array
(
    [qtr_selected] => Array
        (
            [partner_q_m_p__2031] => Array
                (
                    [0] => q1
                    [1] => q2
                )

            [partner_q_m_p__2032] => Array
                (
                    [0] => q1
                )

        )

)

第二个数组:

 Array
(
    [qtr_completed] => Array
        (
            [partner_q_m_p__2031] => Array
                (
                    [0] => q1
                )

        )

)

我如何得到 array1 和 array2 的区别,如下所示:

   Array
(
    [qtr_final] => Array
        (
            [partner_q_m_p__2031] => Array
                (
                    [0] => q2
                )

            [partner_q_m_p__2032] => Array
                (
                    [0] => q1
                )

        )

)

尝试了 array_diff() 函数,但没有得到 array1 作为除 array2 之外的差异,我想要 array1 在从中减去 array2 之后。

【问题讨论】:

  • 你是如何得到这些数组的? @卡皮尔
  • 我已将复选框数据存储在多维数组中,现在我想比较这些数组以了解它们的区别。

标签: php arrays multidimensional-array


【解决方案1】:

您可以通过以下方式获得array1和array2的差异:

<?
// array 1
$array1['qtr_selected']['partner_q_m_p__2031'] = array('q1','q2');
$array1['qtr_selected']['partner_q_m_p__2032'] = array('q1');

// array 2
$array2['qtr_completed']['partner_q_m_p__2031'] = array('q1');

$removalArr = array();
foreach ($array2 as $key1 => $value1) {
    foreach ($value1 as $key2 => $value2) {
        $removalArr = $value2; // get last value of removal array
    }
}

$finalArr = array();
foreach ($array1 as $key1 => $value1) {
    foreach ($value1 as $key2 => $value2) {
        // check difference if available, 
        // if difference available use array_diff else use normal.
        $finalArr['qtr_final'][$key2] = (array_diff($value2,$removalArr) ? array_diff($value2,$removalArr) : $value2); 
    }
}

echo "<pre>";
print_r($finalArr);

?>

结果:

Array
(
    [qtr_final] => Array
    (
        [partner_q_m_p__2031] => Array
        (
            [1] => q2
        )

        [partner_q_m_p__2032] => Array
        (
            [0] => q1
        )    
    )    
)

【讨论】:

    【解决方案2】:

    尝试如下:

    $a1 = Array
    (
            'qtr_selected' => Array
            (
                    'partner_q_m_p__2031' => Array
                    (
                            '0' => 'q1',
                            '1' => 'q2',
                    ),
    
                    'partner_q_m_p__2032' => Array
                    (
                            '0' => 'q1'
                    )
    
            )
    
    );
    
    $a2 = Array
    (
            'qtr_completed' => Array
            (
                    'partner_q_m_p__2031' => Array
                    (
                            '0' => 'q1'
                    )
    
            )
    
    );
    
    $result['qtr_final'] = check_diff_multi($a1['qtr_selected'], 
    
    $a2['qtr_completed']);
    print '<pre>';
    print_r($result);
    print '</pre>';
    
    
    function check_diff_multi($array1, $array2){
        $result = array();
        foreach($array1 as $key => $val) {
            if(isset($array2[$key])){
                if(is_array($val) && $array2[$key]){
                    $result[$key] = check_diff_multi($val, $array2[$key]);
                }
            } else {
                $result[$key] = $val;
            }
        }
    
        return $result;
    }
    

    【讨论】:

    • AnkiiG ,得到结果数组为: Array ( [qtr_final] => Array ( [partner_q_m_p__2031] => Array ( [qtr_final] => Array ( [1] => q2 ) ) [partner_q_m_p__2032] => 数组 ( [0] => q1 ) ) ) 除外:[partner_q_m_p__2031] => 数组 ( [1] => q2 )
    • @kapil 请立即尝试。我已经更新了。感谢您指出问题
    • 感谢@AnkiiG,您的解决方案现在也运行良好。
    【解决方案3】:

    简单地做一个像as这样的自定义函数

    function check_diff($arr1, $arr2){
        $check = (is_array($arr1) && count($arr1)>0) ? true : false;
        $result = ($check) ? ((is_array($arr2) && count($arr2) > 0) ? $arr2 : array()) : array();
        if($check){
            foreach($arr1 as $key => $value){
                if(isset($result[$key])){
                    $result[$key] = array_diff($value,$result[$key]);
                }else{
                    $result[$key] = $value;
                }
            }
        }
    
        return $result;
    }
    $result['qtr_final'] = check_diff($a1['qtr_selected'],$a2['qtr_completed']);
    print_r($result);
    

    【讨论】:

    • 如果第一个数组为空,那么我仍然在最终数组中获取值,我想要的是如果第一个数组不存在,那么它不应该在最终数组中。数组([qtr_final] => 数组([partner_q_m_p__2031] => 数组([0] => q1)))
    • 我想得到未完成的“qtr”,即,如果第一个数组不存在,那么它不应该在最终数组中,第二个数组保存完成的 qtr。
    猜你喜欢
    • 2020-10-08
    • 2021-07-31
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2010-11-14
    相关资源
    最近更新 更多