Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.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,这就是困扰我的原因 我有两个阵列: $array1 = array('[param1]' ,'demo' ,'[param2]' ,'some' ,'[param3]'); $array2 = array('value1' ,'demo' ,'value2' ,'some' ,'value3'); 现在我想比较这两个数组,并删除所有重复的值。 最后,我希望这两个数组中没有“demo”和“some”值。 我想从数组-s中删除具有相同索引键和值的所有值。 数组总是有相同数量的值和索引,我只

这就是困扰我的原因

我有两个阵列:

$array1 = array('[param1]' ,'demo' ,'[param2]' ,'some' ,'[param3]');
$array2 = array('value1'   ,'demo' ,'value2'   ,'some' ,'value3');
现在我想比较这两个数组,并删除所有重复的值。
最后,我希望这两个数组中没有“demo”和“some”值。
我想从数组-s中删除具有相同索引键和值的所有值。
数组总是有相同数量的值和索引,我只想比较它们并从它们中删除具有相同索引键和值的条目

我现在正在做这样的事情:

$clean1 = array();
$clean2 = array();    

foreach($array1 as $key => $value)
{
    if($value !== $array2[$key])
    {
        $clean1[$key] = $value;
        $clean2[$key] = $array2[$key];
    }
}

var_export($clean1);
echo "<br />";
var_export($clean2);
$clean1=array();
$clean2=array();
foreach($array1作为$key=>$value)
{
如果($value!=$array2[$key])
{
$clean1[$key]=$value;
$clean2[$key]=$array2[$key];
}
}
var_出口(1美元);
回声“
”; var_出口(2美元);
这很有效!但是我想知道还有其他的方法吗?也许不用foreach循环?还有更优雅的方法吗

array_unique( array_merge($arr_1, $arr_2) );
或者你可以:

$arr_1 = array_diff($arr_1, $arr_2);
$arr_2 = array_diff($arr_2, $arr_1);

我想…

您可以在PHP中使用函数array_diff,它将返回包含两个数组之间相同键的数组

$clean1 = array_diff($array1, $array2);

由于
$array1
$array2
的长度始终相同,因此可以执行以下操作:

<?php

    $array1 = array('[param1]' ,'demo' ,'[param2]' ,'some' ,'[param3]');
    $array2 = array('value1'   ,'demo' ,'value2'   ,'some' ,'value3');

    $map = array_combine($array1,$array2);
    $map = array_filter($map ,function ($item) use (&$map) {
        $keep_data = ($item != key($map));
        next($map);
        return $keep_data;
    });

    $clean1 = array_keys($map);
    $clean2 = array_values($map);

    var_export($clean1);
    echo "<br />";
    var_export($clean2);

?>

更好吗?你决定

怎么样

$res = array_diff($array1, $array_intersect($array1, $array2));
$reindexed = array_combine(array_keys($res), array_values($res));
或者简单地说,如果不需要钥匙的话

array_values(array_diff($array1, $array_intersect($array1, $array2)));

您的解决方案绝对是最“优雅”的(意思是最容易阅读,代码量最少),但这里有另一个使用的解决方案。它会保留密钥,并按照您的要求以增量顺序放置它们

$array1=['[param1]'、[demo'、[param2]'、[some'、[param3]';
$array2=['value1'、'demo'、'value2'、'some'、'value3'];
$clean1=$array1;
$clean2=阵列差异(
$array2,
$array1,
//需要有“&”,以便设置值。
函数($a,$b)使用(&$clean1,$array1,$array2){
//如果键不相同,请使用isset()
//或数组的长度不同。
如果(isset($array2[$b])&&$array2[$b]====$array1[$b]){
未结算($1[$b]);
}
返回strcmp($array2[$a],$array1[$b]);
});
印刷费($1);
印刷费($2);
将返回此文件:

Array
(
    [0] => [param1]
    [2] => [param2]
    [4] => [param3]
)
Array
(
    [0] => value1
    [2] => value2
    [4] => value3
)

工作示例。

例如,我有两个数组,如下所示:

$array1=Array([0] => parking.jpeg);
$array2=Array ([0] => parking.jpeg [1] => logo.jpeg);
$final_output = array_merge($clean1, $clean2);
首先比较array1和array2,如下所示,这将返回null

$clean1 = array_diff($array1, $array2);
第二次比较array2和array1,结果将返回
logo.jpeg

$clean2 = array_diff($array2, $array1);
现在,您可以在一个数组中合并这两个差异,如下所示:

$array1=Array([0] => parking.jpeg);
$array2=Array ([0] => parking.jpeg [1] => logo.jpeg);
$final_output = array_merge($clean1, $clean2);

输出:
Array([0]=>logo.jpeg)

处理两个数组的最优雅方式莫过于使用标准的
foreach()
循环。寻找函数等价物只会导致不必要的代码卷积。没有必要回避迭代构造——它不会让您看起来像一个“基本的程序员”,它表明您知道解决问题的最干净、最可读的方法

而且太多的其他答案不尊重指数-值关系

最终,您的问题的答案是:保持代码的原样。 下面是如何使用函数式编程单独处理每个数组(
array\u diff\u ukey()
是不必要的,使用
array\u merge()
的任何其他答案都会误解这个问题)

代码:()


这就是说,如果您对基于构造的迭代有一种不自然的偏见,那么您可以使用这些一行程序,但是它们将在后台对您的数据执行4次单独的迭代,而
foreach()
只执行一次

代码:()


你能定义什么是“优雅”吗?我看这里没有问题……这总是需要线性搜索。在这方面,你的解决方案是最有效的。这个问题不清楚,因为质量太差。
的逻辑语句我想从array-s中删除具有相同索引键和值的所有值。
在示例数据中没有很好地表示。这导致发布的答案不符合索引值关系。谢谢!第二个是“优雅”!但是,array_diff从arr_1中取消设置$arr_2中不存在的键,并返回该数组,其中包含顺序不正确的键。这对我来说可能是个问题:(我需要一个从0:S开始的新数组。有没有办法重置数组键,如果我有像0,3,7这样的键,我可以将它们重置为1,2,3吗?如果没有的话,我将与第一个foreach循环进行斗争。是的,不用迭代愚蠢的PHP重循环xD1,这很好。“最好不要迭代愚蠢的PHP重循环”--这是毫无意义的,因为PHP的循环通常优于函数等价物。2.OP声明:“我想删除数组-s中具有相同索引键和值的所有值。“--重新排列输入数组中的元素,以查看您的两个代码段都失败:此答案不应被接受或问题不清楚。谢谢!第二个是“优雅的”!但是,it array_diff从arr_1取消设置$arr_2中不存在的键。这可能是我的问题:(我需要从0:S开始的新数组。有没有办法重置数组键,如果我有像0、3、7这样的键,我可以将它们重置为1、2、3吗?这将删除第一个参数数组中的唯一元素。喔,对我来说,这一个更复杂。我认为我对foreach循环做得太多了,但看起来这是最好的方法。至少ast对我来说,对你来说,这一条可能更清晰。谢谢你的评论!是的…同意…而且速度也慢了3倍:)请添加一些解释,以便人们了解此代码为什么不删除数组中的重复项
var_export(
    [
        'clean1' => array_values(array_diff_assoc($arr_1, $arr_2)),
        'clean2' => array_values(array_diff_assoc($arr_2, $arr_1))
    ]
);