Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php数组差异_Php_Arrays - Fatal编程技术网

php数组差异

php数组差异,php,arrays,Php,Arrays,我试图找出两个数组中的差异 $inven_old = array(1,2,3,4); $inven_new = array(1,2,3,4,5); $result = array_diff($inven_old, $inven_new); print_r($result); 为什么结果一文不值 不应该是“5”吗 如果没有,我该怎么做我想做的事 返回一个数组,该数组包含array1中任何其他数组中都不存在的所有项 array_diff()给出从第一个数组中减去除第一个之外的所有数组的结果

我试图找出两个数组中的差异

$inven_old = array(1,2,3,4); 
$inven_new = array(1,2,3,4,5); 
$result = array_diff($inven_old, $inven_new); 
print_r($result);
为什么结果一文不值

不应该是“5”吗

如果没有,我该怎么做我想做的事

返回一个数组,该数组包含array1中任何其他数组中都不存在的所有项

array_diff()
给出从第一个数组中减去除第一个之外的所有数组的结果。因此,在第二个数组中而不是第一个数组中的东西不会显示。(换句话说,这不是对称差异。)

返回一个数组,该数组包含array1中任何其他数组中都不存在的所有项

因此,如果你这样做:

$result = array_diff($inven_new, $inven_old);
结果将包含“5”

奖励:如果您需要不考虑阵列顺序的功能,请尝试:

$result = array_diff($a + $b, array_intersect($a, $b));

第二个数组应该是第一个

$inven_old = array(1,2,3,4); 
$inven_new = array(1,2,3,4,5); 
$result = array_diff($inven_new, $inven_old); 
print_r($result);

要使其按预期工作,您需要反转参数:

$result = array_diff($inven_new, $inven_old); 

否则,您将检查inven_new中缺少哪些元素,显然没有缺少任何元素。

没有内置函数,但您可以轻松编写自定义函数():


这将从第一个阵列(
$old
)开始消耗,直到所有阵列都消失:

$result = array();
$old = array_count_values($old);
foreach($new as $value)
{
    @$old[$value] ? $old[$value]-- : $result[] = $value;
}
结果:

$old = array(5,5,4);
$new = array(5,5,4,4);

...

array(1) {
  [0]=>
  int(4)
}

很晚才回复,但也许这会对某人有所帮助

function array_deep_diff($d1, $d2) {
    if (is_array($d1) && is_array($d2))  {
        $diff = array();
        foreach (array_unique(array_merge(array_keys($d1), array_keys($d2))) as $key) {
            if (!array_key_exists($key, $d1)) {
                $diff['added'][$key] = $d2[$key];
            } else if (!array_key_exists($key, $d2)) {
                $diff['removed'][$key] = $d1[$key];
            } else {
                $tmp = array_deep_diff($d1[$key], $d2[$key]);
                if (!empty($tmp)) $diff[$key] = $tmp;
            }
        }
        return $diff;

    } else if (!is_array($d1) && !is_array($d2))  {
        if ($d1 == $d2) return array();
        $ret = "$d1 ---> $d2";
        // just a little touch for numerics, might not be needed
        if (is_numeric($d1) && is_numeric($d2)) {
            if ($d1 > $d2) $ret .= ' [- ' . ($d1 - $d2) . ']';
            if ($d1 < $d2) $ret .= ' [+ ' . ($d2 - $d1) . ']';
        }
        return $ret;

    } else {
        return array('Array compared with NonArray');
    }       
}
函数数组\u deep\u diff($d1,$d2){
if(is_数组($d1)和&is_数组($d2)){
$diff=array();
foreach(数组_唯一(数组_合并(数组_键($d1),数组_键($d2))作为$key){
如果(!array_key_存在($key,$d1)){
$diff['added'][$key]=$d2[$key];
}否则,如果(!array_key_存在($key,$d2)){
$diff['removed'][$key]=$d1[$key];
}否则{
$tmp=array_deep_diff($d1[$key],$d2[$key]);
如果(!empty($tmp))$diff[$key]=$tmp;
}
}
返回$diff;
}如果(!is_数组($d1)和&!is_数组($d2))为else{
if($d1==$d2)返回数组();
$ret=“$d1-->$d2”;
//只是稍微接触一下数字,可能就不需要了
如果(是数字($d1)和&是数字($d2)){
如果($d1>$d2)$ret.='[-'($d1-$d2)。']';
如果($d1<$d2)$ret.='[+'($d2-$d1)。']';
}
返回$ret;
}否则{
返回数组(“数组与非数组比较”);
}       
}

尝试
var\u dump($result)
查看它的结构
返回一个数组,该数组包含来自array1的所有条目,而这些条目在任何其他数组中都不存在。
是否有命令执行我需要的操作?您不能;array_diff返回数组中的所有唯一项。在这两个数组中,都有5和4,因此没有唯一性。数组_diff不关心数组中元素的数量。@user1022585:不,没有任何内置元素
function array_deep_diff($d1, $d2) {
    if (is_array($d1) && is_array($d2))  {
        $diff = array();
        foreach (array_unique(array_merge(array_keys($d1), array_keys($d2))) as $key) {
            if (!array_key_exists($key, $d1)) {
                $diff['added'][$key] = $d2[$key];
            } else if (!array_key_exists($key, $d2)) {
                $diff['removed'][$key] = $d1[$key];
            } else {
                $tmp = array_deep_diff($d1[$key], $d2[$key]);
                if (!empty($tmp)) $diff[$key] = $tmp;
            }
        }
        return $diff;

    } else if (!is_array($d1) && !is_array($d2))  {
        if ($d1 == $d2) return array();
        $ret = "$d1 ---> $d2";
        // just a little touch for numerics, might not be needed
        if (is_numeric($d1) && is_numeric($d2)) {
            if ($d1 > $d2) $ret .= ' [- ' . ($d1 - $d2) . ']';
            if ($d1 < $d2) $ret .= ' [+ ' . ($d2 - $d1) . ']';
        }
        return $ret;

    } else {
        return array('Array compared with NonArray');
    }       
}