2015-07-28 117 views
4

我有两个数组在其中,我需要比较两个数组并返回不匹配的数组。PHP比较数组并返回不同

我有两个数组,这两个看起来像这样:

$arr1 = array(
      array('name' => 'Alan', 'age' => '34', 'country' => 'usa'), 
      array('name' => 'James', 'age' => '24', 'country' => 'spain'), 
      ); 

$arr2 = array(
      array('name' => 'Alan', 'age' => '34', 'country' => 'usa'), 
      array('name' => 'James', 'age' => '54', 'country' => 'spffain'), 
     ); 

我想通过比较姓名,年龄和国家的数组并返回我不匹配的数组。

到目前为止我的代码:

$intersect = array_uintersect($arr1, $arr2, 'compareDeepValue'); 
echo "<pre>", print_r($intersect); 

function compareDeepValue($val1, $val2) 
{ 
    return strcmp($val1['age'], $val2['age']); 
    return strcmp($val1['country'], $val2['country']); 
    return strcmp($val1['name'], $val2['name']); 

} 

上面的代码返回匹配的数组。我如何更改代码以获取不匹配的数组?

预期输出:

Array 
(
    [0] => Array 
     (
      [name] => James 
      [age] => 21 
      [country] => spain 
     ) 

) 
+1

可以使用的strcmp($ VAL1 [ '年龄'],$ VAL2 [ '年龄']); –

+0

检查这个帖子:http://stackoverflow.com/questions/12169821/compare-differences-in-multidimensional-array – Javi

+1

你的'compareDeepValue'有3个返回语句。首先是难以到达的。 –

回答

3

有人在回答将工作中提到的代码,但它是体力劳动:) 你可以使用现有的功能来为你做的工作。对于计算阵列之间的差异,应该使用array_udiff函数(或函数相关)。

你应该写函数比较数组,并用它来计算的区别,就像这样:

<?php 
$arr1 = array(
     array('name' => 'Alan', 'age' => '34', 'country' => 'usa'), 
     array('name' => 'James', 'age' => '24', 'country' => 'spain'), 
     ); 

$arr2 = array(
     array('name' => 'Alan', 'age' => '34', 'country' => 'usa'), 
     array('name' => 'James', 'age' => '54', 'country' => 'spffain'), 
    ); 

// this function checks if 2 arrays with keys and scalar values are the same 
function array_same_check($deepArr1, $deepArr2) { 
    //check if arrays are the same 
    $diffArr = array_diff_assoc($deepArr1, $deepArr2); 
    //if $diffArr has 0 elements - arrays are the same 
    if (count($diffArr) === 0) { 
     return 0; 
    } 
    // arrays are not the same - return arbitratry 1 or -1 
    return 1; 
} 

// now let's compare $arr1 and $arr2 you have 
// (meaning: compare the difference between arrays containing arrays) - we use function above 
$differing = array_udiff ($arr1, $arr2, 'array_same_check'); 

print_r($differing); 

我复制此代码PHPFiddle,它似乎按预期方式工作。

+0

感谢您的帮助.. –

+0

@Kleskowy,我真的很喜欢这一个,但仅供参考,这只会打印主阵列1中不匹配的阵列而不是主阵列2中相应的不匹配阵列。 – WisdmLabs

+0

@WisdmLabs当然,就像所有的array_diff函数一样将。以相反的顺序传递数组,并且您拥有所有无与伦比的结果。 – Kleskowy

3
Your Arrays: 

$arr1 = array(
      array('name' => 'Alan', 'age' => '34', 'country' => 'usa'), 
      array('name' => 'James', 'age' => '24', 'country' => 'spain'), 
      ); 

$arr2 = array(
      array('name' => 'Alan', 'age' => '34', 'country' => 'usa'), 
      array('name' => 'James', 'age' => '54', 'country' => 'spffain'), 
     ); 



foreach($arr1 as $key=>$arr) 
{ 
$bool = true; 
$ar1 = $arr; 
$ar2 = $arr2[$key]; 

foreach($ar1 as $ky=>$val) 
{ 
    if($val != $ar2[$ky]) 
    { 
    $bool = false; 
    break; 
    } 
} 

if(!$bool) 
{ 
    echo "Unmatched Arrays: \r\n"; 
    print_r($ar1); echo " in Main Array 1 & \r\n"; 
    print_r($ar2); echo " in Main Array 2. \r\n"; 
} 

} 
+0

你的代码仍然返回我匹配的数组。感谢您的努力.. –

+0

亲爱的,布尔条件是不正确的。现在试试!谢谢! – WisdmLabs

+0

@maxcheng这可能适用于示例提供的数据,但恕我直言的比较在这里很薄弱,而且这些代码并不是可重用的。如果你喜欢,请查看我的答案。 – Kleskowy

2

试试这个

$arr1 = array(
     array('name' => 'Alan', 'age' => '34', 'country' => 'usa'), 
     array('name' => 'James', 'age' => '24', 'country' => 'spain'), 
     ); 

$arr2 = array(
     array('name' => 'Alan', 'age' => '34', 'country' => 'usa'), 
     array('name' => 'James', 'age' => '54', 'country' => 'spffain'), 
    ); 


$tmpArray = array(); 

foreach($arr1 as $data1) { 

    $duplicate = false; 
    foreach($arr2 as $data2) { 
    if($data1['name'] === $data2['name'] && $data1['age'] === $data2['age'] && $data1['country'] === $data2['country']) $duplicate = true; 
    } 

if($duplicate === false) $tmpArray[] = $data1; 
} 
echo "<pre>", print_r($tmpArray); 
0

我想给你一个可能的解决方案。我检查了代码,它似乎符合您的需求。 !

/** @var array $arr1 */ 
    $arr1 = array(
      array(
        'name' => 'Alan', 
        'age'  => '34', 
        'country' => 'usa' 
      ), 
      array(
        'name' => 'James', 
        'age'  => '24', 
        'country' => 'spain' 
      ), 
    ); 

    /** @var array $arr2 */ 
    $arr2 = array(
      array(
        'name' => 'Alan', 
        'age'  => '34', 
        'country' => 'usa' 
      ), 
      array(
        'name' => 'James', 
        'age'  => '54', 
        'country' => 'spffain' 
      ), 
    ); 

    /** @var array $notMatched */ 
    $notMatched = array(); 
    /** 
    * @var int $index 
    * @var array $element 
    */ 
    foreach($arr1 as $index => $element) { 
     /** 
     * @var string $key 
     * @var string $value 
     */ 
     foreach($element as $key => $value) { 
      if($arr2[$index][$key] !== $value) { 
       $notMatched["arr1"] = $arr1[$index]; 
       $notMatched["arr2"] = $arr2[$index]; 
      } 
     } 
    } 
    if(!empty($notMatched)) { 
     echo "Unmatched arrays: \r\n"; 
     echo "Array 1:\r\n"; 
     print_r($notMatched["arr1"]); 
     echo "Array 2:\r\n"; 
     print_r($notMatched["arr2"]); 
    } 
2
$intersect = array_uintersect($arr1, $arr2, 'compareDeepValue'); 
print_r($intersect); 
// add this and it will return the missing array. 
print_r(array_diff_key($arr1, $intersect)); 

function compareDeepValue($val1, $val2) 
{ 
    return strcmp($val1['age'], $val2['age']); 
    return strcmp($val1['country'], $val2['country']); 
    return strcmp($val1['name'], $val2['name']); 
}