在php中从2个数组中查找唯一数组
我的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
$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',
),
)