簡體   English   中英

在 php 中從 2 個數組中找到唯一的數組

[英]find unique array from 2 array in php

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

要根據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

只需在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

根據您的示例,如果我們通過 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) ,你可以重新索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM