我的php代码中有2个数组
$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'),
)
预期结果
$outcome = array(
array('id'=>4, 'roll'=>189, 'name'=>'B'),
array('id'=>3, 'roll'=>744, 'name'=>'D'),
);
尝试了这些方法,但是它们不起作用
答案 0 :(得分:1)
要基于id
和roll
的组合查找2个数组的第二个数组中不存在的所有行,可以创建一个关联数组,该数组将所有ID保留为键,而intern它是自己的数组,关键是滚动编号。
以下是示例数组及其关联数组(例如$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
条件的结果。
代码段:
<?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);
答案 1 :(得分:0)
在in_array(),array_column()和unset()函数的帮助下,只需使用下一个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
和roll
检索结果数组,请使用下一个foreach
循环:
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);
答案 2 :(得分:0)
给出您的示例,如果我们通过id(使用array_column)为每个数组重新索引,然后找到键之间的差异,我们将得到您想要的答案:
<?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',
),
)
如果需要使用array_values($out)
,可以重新编制索引。