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中从2个数组中查找唯一数组_Php_Arrays_Multidimensional Array - Fatal编程技术网

在php中从2个数组中查找唯一数组

在php中从2个数组中查找唯一数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我的php代码中有2个数组 $array_1 = array( array('id'=>1, 'roll'=>145), array('id'=>2, 'roll'=>14), array('id'=>5, 'roll'=>1), ) 第二阵列 预期结果 尝试过这些方法,但都不起作用 数组_唯一 阵列差异 要根据id和roll的组合查找两个数组中第二个数组中不存在的所有行,可以创建一个关联数组,将所有id作为键保存,intern

我的php代码中有2个数组

$array_1 = array(
     array('id'=>1, 'roll'=>145),
     array('id'=>2, 'roll'=>14),
     array('id'=>5, 'roll'=>1),
)
第二阵列

预期结果

尝试过这些方法,但都不起作用

数组_唯一 阵列差异
要根据id和roll的组合查找两个数组中第二个数组中不存在的所有行,可以创建一个关联数组,将所有id作为键保存,intern有自己的数组,其中键是它的卷号

下面是示例数组的示例,以及它的关联数组say$map的外观:

$array_1 = array(
     array('id'=> 1, 'roll'=> 145),
     array('id'=> 2, 'roll'=> 14),
     array('id'=> 5, 'roll'=> 1),
);

Array
(
    [1] => Array
        (
            [145] => 1
        )

    [2] => Array
        (
            [14] => 1
        )

    [5] => Array
        (
            [1] => 1
        )

)
现在,您可以在第二个数组上循环,并使用isset函数检查,然后收集所有不满足isset条件的结果

片段:

演示:

在、和函数的帮助下,只需使用next foreach循环:

foreach($array_2 as $ind => $ar){
    if (in_array($ar['id'],array_column($array_1,'id'))) unset($array_2[$ind]);
}

sort($array_2);
如果要基于相同id检索结果数组并滚动,请使用next foreach循环:


根据您的示例,如果我们使用array_列按id重新索引每个数组,然后找到键之间的差异,我们将得到您想要的答案:

<?php

$array_1 = array(
     array('id'=>1, 'roll'=>145),
     array('id'=>2, 'roll'=>14),
     array('id'=>5, 'roll'=>1),
);

$array_2 = array(
     array('id'=>1, 'roll'=>145, 'name'=>'A'),
     array('id'=>4, 'roll'=>189, 'name'=>'B'),
     array('id'=>5, 'roll'=>1, 'name'=>'C'),
     array('id'=>3, 'roll'=>744, 'name'=>'D'),
);

$out = array_diff_key(
    array_column($array_2, null, 'id'), 
    array_column($array_1, null, 'id')
);

var_export($out);

如果希望使用数组\ u值$out,您可以重新编制索引。

您的预期结果取决于什么条件?我想根据以下条件找出两个数组可能重复的差异:。。。身份证、卷名、姓名及其组合?我不明白为什么id=>5是不同的,因为id=>5 roll=>1存在于两个数组中。@vivek_23更新了这个问题:很抱歉,id=>2 roll=>14只存在于第一个数组中,它不应该包含在唯一结果数组中吗?@Jibstroos有趣的问题。看起来OP只想根据第二个数组检索结果,因为它有一个额外的名称键。如果OP澄清了这一点,肯定会更新我的答案。@runningmark您希望最终结果中的id=>2,roll=>14吗?不,因为第一个数组数据来自数据库,第二个数组数据来自用户填写的表单!是的,一开始并不完全清楚…:-你的解决方案做得很好!当然,如果每个数组中的id和roll对不同,则可能会得到意外的结果。
<?php

$array_1 = array(
     array('id'=> 1, 'roll'=> 145),
     array('id'=> 2, 'roll'=> 14),
     array('id'=> 5, 'roll'=> 1),
);

$array_2 = array(
     array('id'=> 1, 'roll'=> 145, 'name'=>'A'),
     array('id'=> 4, 'roll'=> 189, 'name'=>'B'),
     array('id'=> 5, 'roll'=> 1, 'name'=>'C'),
     array('id'=> 3, 'roll'=> 744, 'name'=>'D'),
);


$map = [];

foreach($array_1 as $curr_data){
    if(!isset($map[$curr_data['id']])) $map[$curr_data['id']] = [];
    $map[$curr_data['id']][$curr_data['roll']] = true;
}

$result = [];

foreach($array_2 as $curr_data){
    if(!isset($map[$curr_data['id']],$map[$curr_data['id']][$curr_data['roll']])) $result[] = $curr_data;
}

print_r($result);
foreach($array_2 as $ind => $ar){
    if (in_array($ar['id'],array_column($array_1,'id'))) unset($array_2[$ind]);
}

sort($array_2);
foreach($array_2 as $ind => $ar){
    if (in_array($ar['id'],array_column($array_1,'id')) && 
        in_array($ar['roll'],array_column($array_1,'roll'))) unset($array_2[$ind]);
}

sort($array_2);
<?php

$array_1 = array(
     array('id'=>1, 'roll'=>145),
     array('id'=>2, 'roll'=>14),
     array('id'=>5, 'roll'=>1),
);

$array_2 = array(
     array('id'=>1, 'roll'=>145, 'name'=>'A'),
     array('id'=>4, 'roll'=>189, 'name'=>'B'),
     array('id'=>5, 'roll'=>1, 'name'=>'C'),
     array('id'=>3, 'roll'=>744, 'name'=>'D'),
);

$out = array_diff_key(
    array_column($array_2, null, 'id'), 
    array_column($array_1, null, 'id')
);

var_export($out);
array (
    4 => 
    array (
      'id' => 4,
      'roll' => 189,
      'name' => 'B',
    ),
    3 => 
    array (
      'id' => 3,
      'roll' => 744,
      'name' => 'D',
    ),
  )