查找两个二维数组之间的交集和差异

问题描述 投票:0回答:2

我有两个数组。

$paternalSiblings = fname => John lname => Doe gender => M birth_year => 1988
                    fname => Sophie lname => Ellison gender => F birth_year => 1990

$maternalSiblings = fname => John lname => Smith gender => M birth_year => 1997    
                    fname => John lname => Doe gender => M birth_year => 1988

数组的输出:

Array ( [0] => Array ( [fname] => John [lname] => Doe [birth_year] => 1988[gender] => Male [fname] => Sophie [lname] => Ellison [birth_year] => 1990 [death_date] => [gender] => Female ) ) 
Array ( [0] => Array ( [fname] => John [lname] => Doe [birth_year] => 1988[gender] => Male [fname] => John [lname] => Smith [birth_year] => 1997 [death_date] => [gender] => Male ) ) 

$fullSiblings = $this->arrayIntersect( $paternalSiblings , $maternalSiblings );

<?php
function arrayIntersect( $primary_array, $secondary_array ) {

     if ( !is_array( $primary_array ) || !is_array( $secondary_array ) ) {
         return false;
     }

     if ( !empty( $primary_array ) ) {

         foreach( $primary_array as $key => $value ) {

             if ( !isset( $secondary_array[$key] ) ) {
                 unset( $primary_array[$key] );
             } else {
                 if ( serialize( $secondary_array[$key] ) != serialize( $value ) ) {
                     unset( $primary_array[$key] );
                 }
             }

         }

         return $primary_array;

     } else {
         return array();
     }

     } 
    ?>

这个功能不起作用。我怎样才能使数组相交和不同?我注意到内置函数 array_intersect_assoc() 和 array_diff_assoc() 不适用于多维数组。实现目标的最佳方法是什么?

php arrays multidimensional-array difference intersect
2个回答
0
投票

您至少需要一个固定值来识别每一行,并检查其他值的差异。

$first = array(
 "uniqueId1" => array("name" => "Ignacio", "email" => "[email protected]"),
 "uniqueId2" => array("name" => "John", "email" => "[email protected]")
);

$second = array(
 "uniqueId1" => array("name" => "Ignacio", "email" => "[email protected]"),
 "uniqueId2" => array("name" => "Luis", "email" => "[email protected]")
);

您可以比较并获得差异:

foreach($first as $keyRow => $firstRow) {
 if(isset($second[$keyRow])) { //The first row exists in second array, so, I will check it
  foreach($firstRow as $key => $value) {
   if($second[$keyRow][$key] != $value) {
    echo "For row: ".$keyRow.", ".$second[$keyRow][$key]." is not equal to: ".$value."<br />";
   }
  }
 }
}

输出:

For row: uniqueId1, [email protected] is't equal to: [email protected]
For row: uniqueId2, Luis is't equal to: John

0
投票
  • 查找

    $paternalSiblings
    中与
    $maternalSiblings
    中完全不同的行:

    var_export(
        array_udiff($paternalSiblings, $maternalSiblings, fn($a, $b) => $a <=> $b)
    );
    
  • 查找

    $maternalSiblings
    中与
    $paternalSiblings
    中完全不同的行:

    var_export(
        array_udiff($maternalSiblings, $paternalSiblings, fn($a, $b) => $a <=> $b)
    );
    

  • 查找

    $paternalSiblings
    中与
    $maternalSiblings
    中的行完全相同的行:

    var_export(
        array_uintersect($paternalSiblings, $maternalSiblings, fn($a, $b) => $a <=> $b)
    );
    
  • 查找

    $maternalSiblings
    中与
    $paternalSiblings
    中的行完全相同的行:

    var_export(
        array_uintersect($maternalSiblings, $paternalSiblings, fn($a, $b) => $a <=> $b)
    );
    

  • 通过比较具有相同第一级位置的行,找到

    $paternalSiblings
    中与
    $maternalSiblings
    中元素不同的关联元素:

    var_export(
        array_map('array_diff_assoc', $paternalSiblings, $maternalSiblings)
    );
    
  • 通过比较具有相同第一级位置的行,找到

    $maternalSiblings
    中与
    $paternalSiblings
    中元素不同的关联元素:

    var_export(
        array_map('array_diff_assoc', $maternalSiblings, $paternalSiblings)
    );
    

  • 通过比较具有相同第一级位置的行,找到

    $paternalSiblings
    中与
    $maternalSiblings
    中的元素相同的关联元素:

    var_export(
        array_map('array_intersect_assoc', $paternalSiblings, $maternalSiblings)
    );
    
  • 通过比较具有相同第一级位置的行,找到

    $maternalSiblings
    中与
    $paternalSiblings
    中的元素相同的关联元素:

    var_export(
        array_map('array_intersect_assoc', $maternalSiblings, $paternalSiblings)
    );
    
© www.soinside.com 2019 - 2024. All rights reserved.