基于两个二维数组的比较创建“结果”数组?

时间:2014-03-02 09:36:28

标签: php arrays foreach associative-array array-difference

我有两个我想比较的二维数组:

$array1
Array
(
    [0] => Array
        (
            [A] => GB
            [B] => Harry
            [C] => British Army
            [D] => Eton College
            [E] => Cressida Bonas
        )

    [1] => Array
        (
            [A] => GB
            [B] => William
            [C] => Royal Air Force
            [D] => Eton College
            [E] => Catherine Middleton
        )

)

$array2
Array
(
    [0] => Array
        (
            [A] => GB
            [B] => Harry
            [C] => British Army
            [D] => Eton College
            [E] => Cressida Bonas
        )

    [1] => Array
        (
            [A] => GB
            [B] => James
            [C] => British Army
            [D] => Millfield
            [E] => Unknown
        )

)

如果任何子数组值不同,则按如下方式生成布尔值true / false结果数组:

$results_array
Array
(
    [0] => Array
        (
            [0] => true
        )

    [1] => Array
        (
            [0] => false      
        )

)

更新 两个数组总是具有相同长度的父数组(但子数组值的长度可能不同)。

我无法理解如何以递归方式使用foreach来获取结果数组。

任何一般性的想法或建议?

4 个答案:

答案 0 :(得分:0)

我不知道你试图用foreach循环做什么。你是说每个数组都有2 child arrays,或者每个子数组都有5 values?无论如何,我希望这能帮到你!

我会使用其中一些:

  • array_intersect
  • array_intersect_assoc
  • array_diff
  • array_diff_assoc

代码:

<?php

$array1 = [
    [
        'A' => 'GB',
        'B' => 'Harry',
        'C' => 'British Army',
        'D' => 'Eton College',
        'E' => 'Cressida Bonas',
    ],
    [
        'A' => 'GB',
        'B' => 'William',
        'C' => 'Royal Air Force',
        'D' => 'Eton College',
        'E' => 'Catherine Middleton',
    ]
];

// What Values are in common
$result1 = array_intersect_assoc($array1[0], $array1[1]);
print_r($result1);

$array2 = [
    [
        'A' => 'GB',
        'B' => 'Harry',
        'C' => 'British Army',
        'D' => 'Eton College',
        'E' => 'Cressida Bonas',
    ],
    [
        'A' => 'GB',
        'B' => 'James',
        'C' => 'British Army',
        'D' => 'Millfield',
        'E' => 'Unknown',
    ]
];

// What values are different
$result2 = array_diff_assoc($array2[0], $array2[1]);
print_r($result2);


// A Way to check numerically
$perfectMatch = 5;
$intersect = array_intersect_assoc($array1[0], $array1[1]);
$intersectCount = count($intersect);
if ($intersectCount != $perfectMatch) {
    echo "<br> Not Every value matches.";
} else {
    echo "<br> Perfect Match!";
}

要比较完整的数组$array1$array2,您可以这样做:

<?php 

// (With array code above)

$c1 = count($array1);
$c2 = count($array2);
if ($c1 != $c2) {
    echo "<br>Array Children must be the same";
}

$result = [];
for ($i = 0; $i < $c1; $i++) {
    $in_common = array_intersect($array1[$i], $array2[$i]);
    $result[] = count($intersect);
}

print_r($result);

答案 1 :(得分:0)

您可以使用==运算符。将第一个数组作为键数组传递($k=>$arr)[因为该值是另一个数组]。现在使用简单的==比较运算符比较两个数组。您甚至可以使用===运算符执行严格匹配。

<?php
$arr1=array(0=>array('A'=>'GB','B'=>'Harry','C'=>'British Army'),1=>array('A'=>'GB','B'=>'William','C'=>'Royal Air Force'));
$arr2=array(0=>array('A'=>'GB','B'=>'Harry','C'=>'British Army'),1=>array('A'=>'GB','B'=>'James','C'=>'British Army'));

foreach($arr1 as $k=>$arr)
{
    $resarr[][$k]=($arr==$arr2[$k])? "true" : "false";
}
print_r($resarr);

Demo

<强> OUTPUT :

Array
(
    [0] => Array
        (
            [0] => true
        )

    [1] => Array
        (
            [1] => false
        )

)

答案 2 :(得分:0)

您可以使用array_map(),假设两个数组的长度相同:

$result = array_map(function($a, $b) {
    return [$a == $b]; // create single element boolean array
}, $array1, $array2);

您可以使用=====;如果两个数组具有相同的键和值对,则前者(==)将产生true,而后者(===)仅在两者的键都产生true时产生{{1}}数组的顺序也一样。

答案 3 :(得分:0)

有些答案使用==运算符;但是,如果数组没有相同的key =&gt;值匹配,则无效;试试这个:

$results = array();
foreach ($array1 as $i => $subarray)
{
    /* No need to proceed if subarray[i] does not exist in the second array */
    if(!is_array($array2[$i]))
    {
        $results[$i] = false;
        continue;
    }        
    $results[$i] = (count(array_diff($array1[$i], $array2[$i])) == 0) ? true : false;
}

此解决方案比使用==比较运算符慢一点。但是,使用==将不适用于以下情况:

$array1 => array(1 => "John", 2 => "James");
$array2 => array(1 => "James", 2 => "John");

此处,键不相同,但值是重复的。使用==的解决方案在比较这些数组时将返回false。

$array1 == $array2     // False