在PHP中使用array_diff_assoc函数

时间:2011-05-19 21:26:27

标签: php arrays multidimensional-array associative-array

您好我有两个嵌套数组,需要找到引用数组和数据数组之间的区别。我正在使用array_dif_assoc函数,我无法得到正确的区别,我不知道为什么我无法得到它。如果我犯了一些错误或者我必须以递归的方式做某事,有人可以帮助我吗?

$allCoursesAvailable = array(array('id'=>0,'name'=>'Select-One'), array('id'=>1,'name'=>'course1'),array('id'=>1,'name'=>'course2'),array('id'=>3,'name'=>'course3'));

$allCoursesforUser = array(array('id'=>0,'name'=>'Select-One'), array('id'=>1,'name'=>'course1'),array('id'=>4,'name'=>'course4'),array('id'=>5,'name'=>'course5'),array('id'=>6,'name'=>'course4'));

echo '<pre>';print_r(array_diff_assoc($allCoursesAvailable,$allCoursesforUser));

我得到一个空数组。当我使用array_diff_assoc时,我应该得到带有course2和course3的数组,因为它们不是第二个数组的一部分。

我错过了PHP端的一些逻辑吗?

3 个答案:

答案 0 :(得分:4)

您总是可以从阅读PHP手册开始。

对于array_diff_assochttp://php.net/manual/en/function.array-diff-assoc.php),据说this function only checks one dimension of a n-dimensional array. Of course you can check deeper dimensions by using, for example, array_diff_assoc($array1[0], $array2[0]);.

在用户评论中提供了解决方案(这确实有效):

  

55点php在imars dot com   17-Mar-2009 03:09我一直在努力   提到了array_diff_assoc_recursive()   由chinello在gmail dot com和我   认为值得一提   这里。我写了十几个测试用例和   它看起来似乎很好。

<?php
// dwarven Differences:
// * Replaced isset() with array_key_exists() to account for keys with null contents

// 55 dot php at imars dot com Differences:
// Key differences:
// * Removed redundant test;
// * Returns false bool on exact match (not zero integer);
// * Use type-precise comparison "!==" instead of loose "!=";
// * Detect when $array2 contains extraneous elements;
// * Returns "before" and "after" instead of only "before" arrays on mismatch.

function array_compare($array1, $array2) {
    $diff = false;
    // Left-to-right
    foreach ($array1 as $key => $value) {
        if (!array_key_exists($key,$array2)) {
            $diff[0][$key] = $value;
        } elseif (is_array($value)) {
             if (!is_array($array2[$key])) {
                    $diff[0][$key] = $value;
                    $diff[1][$key] = $array2[$key];
             } else {
                    $new = array_compare($value, $array2[$key]);
                    if ($new !== false) {
                         if (isset($new[0])) $diff[0][$key] = $new[0];
                         if (isset($new[1])) $diff[1][$key] = $new[1];
                    };
             };
        } elseif ($array2[$key] !== $value) {
             $diff[0][$key] = $value;
             $diff[1][$key] = $array2[$key];
        };
 };
 // Right-to-left
 foreach ($array2 as $key => $value) {
        if (!array_key_exists($key,$array1)) {
             $diff[1][$key] = $value;
        };
        // No direct comparsion because matching keys were compared in the
        // left-to-right loop earlier, recursively.
 };
 return $diff;
};
?>

答案 1 :(得分:0)

我认为内置数组diffs很浅,这意味着它们只检查第一级并且不会查看其中的数组。

这里有一些解决方案:

PHP - Mutidimensional array diff

答案 2 :(得分:0)

您不应该使用_assoc,而是使用普通array_diffarray_intersect,否则它将比较外部数组的顺序而不仅仅是内容。

array_diff也不适用于子数组,你需要一个解决方法:

print_r(
  array_map("unserialize",
    array_diff(
      array_map("serialize", $allCoursesAvailable),
      array_map("serialize", $allCoursesforUser)
    )
  )
);

哪会给你:

[2] => Array
    (
        [id] => 1
        [name] => course2
    )

[3] => Array
    (
        [id] => 3
        [name] => course3
    )

不确定这是否是你想要的。手动完成它可能仍然是可取的。