【问题标题】:Why does array_diff on arrays of arrays return an empty array?为什么数组数组上的array_diff 返回一个空数组?
【发布时间】:2011-06-24 17:54:45
【问题描述】:

我有两个数组,var_dump 给出以下值:

$array1:

Artifacts:array(2) { [0]=>  array(3) { [0]=>  string(7) "module1" [1]=>  string(16) "path/to/file.txt" [2]=>  string(0) "" } [1]=>  array(3) { [0]=>  string(7) "module2" [1]=>  string(17) "path/to/file2.txt" [2]=>  string(0) "" } }

$array2:

Artifacts:array(1) { [0]=>  array(3) { [0]=>  string(7) "module1" [1]=>  string(16) "path/to/file.txt" [2]=>  string(0) "" } }

我认为执行array_diff($array1,$array2) 会给我一个仅计算第二个元素的数组。相反,我得到了一个空数组。我尝试切换参数,仍然是一个空数组,但这一次并不意外。 array_diff 不会在数组数组上工作吗?

【问题讨论】:

    标签: php


    【解决方案1】:

    来自array_diff 文档。

    此函数仅检查 n 维数组的一维。当然,您可以使用 array_diff($array1[0], $array2[0]); 来检查更深的维度;

    【讨论】:

      【解决方案2】:

      来自array_diff manual page:“这个函数只检查n维数组的一维。当然你可以使用array_diff($array1[0], $array2[0]);来检查更深的维度。”

      【讨论】:

        【解决方案3】:

        来自documentation

        两个元素被认为相等当且仅当(string) $elem1 === (string) $elem2。换句话说:当字符串表示相同时。

        echo (string) array(); 只给你Array,所以对于array_diff,你的数组看起来像:

        $array1 = array('Array', 'Array');
        $array2 = array('Array');
        

        所以要为你的数组创建一个差异,你需要这样的东西(假设数组中的每个元素本身都是一个数组):

        $diff = array();
        
        foreach($array1 as $val1) {
            $contained = false;
            foreach($array2 as $val2) {
                if(count(array_diff($val1, $val2)) == 0) {
                    $contained = true; 
                    break;
                }
            }
            if(!$contained) {
                $diff[] = $val1;
            }
        }
        

        免责声明:这或多或少只是一个草图。

        【讨论】:

        • 如果我理解正确,我将不得不编写自己的函数来查看两个数组之间是否有任何差异,对吗?
        • @Eldros:是的,您必须遍历“外部”数组并为元素使用array_diff
        • 技术上是的。如果您愿意自己寻找并测试它,很可能已经有一个在野外了。
        • documentation 上找到了一个类似的功能...如果我只想再次检查文档,而不是愚蠢地认为它会比较所有类型的元素,因为我一直使用它维数组。这里有一个教训。
        【解决方案4】:

        在这里提问和回答:

        recursive array_diff()?

        【讨论】:

          猜你喜欢
          • 2012-08-26
          • 1970-01-01
          • 1970-01-01
          • 2021-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-25
          • 2022-01-09
          相关资源
          最近更新 更多