通过比较嵌套数组来计算差异

时间:2013-10-01 14:16:28

标签: php arrays

我的印象是array_diff会评估两个数组中值之间的差异。但不知怎的,它不起作用......我猜这里是嵌套数组的问题。显然,array_diff_assoc不是解决方案,因为在这种情况下密钥是无关紧要的。

我甚至不想让它嵌套,只要看看里面的值(在本例中是数组)是否相同。

$file_details = array(
    array(
            "uuid" => "45ebdbaa-380b-483b-80a2-73d7c53088e2",
            "filename" => "train_failure.mp3",
        ),
    array("uuid" => "97baa061-4208-4aeb-8136-eb76c0932a3d",
        "filename" => "train_work1.mp3"
    ),
    array("uuid" => "ksjdfls6-eb76c0932a3d",
        "filename" => "train.mp3"
    ),
);

$items = array(
    array(
            "uuid" => "45ebdbaa-380b-483b-80a2-73d7c53088e2",
            "filename" => "train_failure.mp3",
        ),
     array(
            "uuid" => "1233489eb76c0932a3d",
            "filename" => "train.mp3"
        ),
);

print_r(array_diff($file_details,$items));

这会返回一个空数组......我应该如何修复它?

我想要的输出是

array(
        "uuid" => "97baa061-4208-4aeb-8136-eb76c0932a3d",
        "filename" => "train_work1.mp3"
     ),
array(
        "uuid" => "ksjdfls6-eb76c0932a3d",
        "filename" => "train.mp3"
    ),

UPDATE - :*我知道array_diff对1-d数组不起作用,我很惊讶没有直接的php函数来对多维数组进行比较。*

3 个答案:

答案 0 :(得分:2)

您的数组项是数组,无法作为字符串进行比较(array_diff()会将所有值视为字符串 - 例如,它会尝试通过调用__toString()方法来对对象进行字符串化。

您可以改为使用array_udiff()

$rgResult=array_udiff($file_details, $items, function($rgX, $rgY)
{
   return $rgX['uuid']<$rgY['uuid']?-1:$rgX['uuid']!=$rgY['uuid'];
});

答案 1 :(得分:1)

array_diff()方法应该适用于1-d数组。

答案 2 :(得分:0)

从array_diff()手册页:

  

注意:

     

此函数仅检查n维数组的一维。的   当然,您可以使用

检查更深的尺寸      

array_diff($ array1 [0],$ array2 [0]);