php - 通过比较行来获取两个多维数组之间的差异

标签 php arrays multidimensional-array filtering 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 端的一些逻辑?

最佳答案

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

对于 array_diff_assoc(在 http://php.net/manual/en/function.array-diff-assoc.php 上),据说 此函数仅检查 n 维数组的一维。当然,您可以使用例如 array_diff_assoc($array1[0], $array2[0]); 检查更深的维度。

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

55 dot php at imars dot com 17-Mar-2009 03:09 I've worked on array_diff_assoc_recursive() mentioned by chinello at gmail dot com and I think it might be worth mentioning here. I wrote a dozen test cases and it seems to be holding up pretty well.

<?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;
};
?>

关于php - 通过比较行来获取两个多维数组之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6065068/

相关文章:

Javascript通过相同的对象键重新排列数组

php - ffmpeg shell 输出到 php 头文件?

javascript - 如何使用 javascript、jquery 或其他一些巧妙的方式提交选择中的下一个选项?

php - PHP 中的 $_REQUEST

c# - 使用 C# 从数组中的单词中删除字符串中的单词

java - 将 3 字节数组转换为数字

multidimensional-array - Rust ndarray,对拥有的值进行算术运算

c++ - C/C++ Arrays 多维数组

python - 多维(子列表到列表)分配

php - 页面在登录时重定向到索引