【问题标题】:find unique array from 2 array in php从php中的2个数组中找到唯一的数组
【发布时间】:2019-11-26 12:48:07
【问题描述】:

我的 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

【问题讨论】:

  • 您的预期结果基于什么条件?
  • 我想找出2个数组的区别
  • 基于...idrollname,它们的组合?只是问我不明白为什么id=>5不同的 因为id=>5 roll=>1 存在于两个数组中。
  • @vivek_23 更新了问题:) 抱歉这个错误

标签: php arrays multidimensional-array


【解决方案1】:

要根据 idroll 的组合查找 2 个数组中的第二个数组中不存在的所有行,您可以创建一个关联数组,其中包含所有 ID 作为键,并且实习生拥有自己的数组,其中关键是它的卷号。

下面是示例数组的示例以及它的关联数组(比如$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

【讨论】:

  • id=&gt;2 roll=&gt;14 只存在于第一个数组中,它不应该包含在 unique 结果数组中吗?
  • @jibsteroos 有趣的问题。看起来 OP 只想根据第二个数组检索结果,因为它有一个额外的 name 键。如果 OP 澄清相同,肯定会更新我的答案。
  • @runningmark 您希望id =&gt; 2,roll =&gt; 14 出现在您的最终结果中吗?
  • 不,因为第一个数组数据来自数据库和第二个数组,数据来自用户填写的表单!
  • 是的,起初并不完全清楚...... :-) 你的解决方案做得很好!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    鉴于您的示例,如果我们按 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) 重新索引。

    【讨论】:

    • 当然,如果您的 id 和 roll 对在每个数组中不同,您可能会得到意想不到的结果。
    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 2023-03-11
    • 2011-03-31
    • 1970-01-01
    • 2021-07-18
    • 2011-01-31
    • 2019-04-05
    • 1970-01-01
    相关资源
    最近更新 更多