从PHP 2数组中找到唯一的数组

时间:2019-11-26 12:48:07

标签: php arrays multidimensional-array

我的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'),
);

尝试了这些方法,但是它们不起作用

  • array_unique
  • array_diff

3 个答案:

答案 0 :(得分:1)

要基于idroll的组合查找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);

演示: https://3v4l.org/kUshn

答案 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);

Demo

如果您要基于相同的idroll检索结果数组,请使用下一个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);

Demo2

答案 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),可以重新编制索引。