获得数组之间的差异

时间:2013-08-21 10:16:58

标签: php arrays associative-array

我在这里问了一些类似的问题,https://stackoverflow.com/questions/18343559/compare-two-associative-arrays?noredirect=1#comment26938095_18343559或者compare two associative array and display the difference但是这是一个很好的改进和修改的问题,以便让它变得容易,正如许多Guru建议的那样。请不要否定。如果我有任何错误,请告诉我,我会尽力解决,请?

这是问题...... 我使用的是php 5.3,这个数组是在从生成的PDO MySQL查询中传递了很多进程之后发生的,并使用了以下函数

function diff($new,$old)
{
    $del=array_diff_assoc($old,$new);
    $add=array_diff_assoc($new,$old);
    return $diff=array("old"=>$del, "news"=>$add);
}

该数组如下所示......

$aa= Array
(
    [old] => Array 
    (

                    [cod] => 
                    [gender] => m
                    [title] =>
    )
    [news] => Array 
    (
                    [cod] => 
                    [gender] => f
                    [title] => Mr
                    [wl] => 255
                    [heigh] => 
    )
)

我尝试过以下代码

$ combine = array_merge_recursive($ aa ['old'],$ aa ['news']);

生成以下数组..(这正是我想要的结果)

Array
(
    [gender] => Array 
    (
       [gender] => m
       [gender] => f           
    )
    [title] => Array 
    (
       [title] =>
       [title] => Mr           
    )
    [gender] => Array 
    (
       [gender] => m
       [gender] => f           
    )
    [wl] => Array 
    (
       [wl] =>
       [wl] => 255           
    )
)

但似乎我有一些不需要的数据......

它应该做的是,如果[old]数组中存在任何键并且具有相同键的[news]数组中的值,则显示它,如果[news]数组中的任何键退出,则显示值但是如果[news]数组中有任何键,[old]数组中没有相应的键,没有值,不显示它。

任何想法,我都会感激......我只是堆了一些......

1 个答案:

答案 0 :(得分:1)

你在那里犯了一个逻辑错误。在具有键值对的数组中,同一个键不能有两个不同的值:

[gender] => Array 
    (
       [gender] => m
       [gender] => f
    )

在上面得到的数组中,gender重复两次。 $array['gender']['gender']会返回什么?

假设您想要一个数组:

[gender] => Array 
    (
       m,
       f
    )

您可以迭代两个数组并添加相应的值。这是一个假设空值为null的示例:

$final = array(); // final array
$old;
$new;

foreach ($old as $k => $v) {
    $final[$k] = array($v, null);
}

foreach ($new as $k => $v) {
    if (array_key_exists($k, $final) {
        $final[$k][1] = $v;
    } else {
        $final[$k] = array(null, $v);
    }
}

上面的代码将打印出以下内容:

Array
(
    [gender] => Array 
    (
       m, f           
    )
    [title] => Array 
    (
       null, Mr           
    )
    [gender] => Array 
    (
       m, f           
    )
    [wl] => Array 
    (
       null, 255           
    )
)

这是与结果数组最接近的东西。