PHP - 比较数组的每两个值

时间:2016-05-15 17:33:50

标签: php arrays multidimensional-array compare

我有一个包含整数值的多维数组。例如:

Array ( [0] => Array ( [0] => 0 [1] => 1 ) [1] => Array ( [0] => 2 [1] => 1 ) [2] => Array ( [0] => 4 [1] => 3 ) [3] => Array ( [0] => 3 [1] => 1 ) ... and so on.  

我想要做的是比较数组中的每两个元素(来自数组的第一级)。但是有一个问题。让我们取前两个元素(0和1):首先,我想比较它们的第一对键值(示例中的值是0和2),之后第二对键值应该是comared (在示例中 - 均为1)。

输出应该是(对于第一对):
第一个元素 - [0,1]
第二个要素 - [2,1]
在第一次比较中,脚本应该返回false(0不等于2),但在第二次比较中它应该返回true(1 = 1)。

我实际上并不知道如何做到这一点。我试图将其设为三维(array_chunk),但它不起作用,我想我只是以这种方式让我的生活更加艰难。

无论哪种方式,我都会发布三维版本的代码。

$tmpBig = array_chunk($indexArr,2);
for ($i=0; $i < count($tmpBig); $i++) { 
    print_r($tmpBig[$i]);
}

foreach ($tmpBig as $key => $value) {
    foreach ($value as $key2 => $value2) {
        foreach ($value2 as $key3 => $value3) {
            //echo $tmpBig[$key][$key2][$key3];
            //echo "<br>";
            if ($tmpBig[0][0] === $tmpBig[1][0]) {
                echo "yes";
            }else echo "no";
        }
    }
}

每个建议都受到欢迎和赞赏!

3 个答案:

答案 0 :(得分:0)

将数组Array ( [0] => Array ( [0] => 0 [1] => 1 ) [1] => Array ( [0] => 2 [1] => 1 ) [2] => Array ( [0] => 4 [1] => 3 ) [3] => Array ( [0] => 3 [1] => 1 )指定为$array

for($i = 1; $i < count($array); $i++) {
    for($j = 0; $j < count($array[$i]); $j++) {
        if($array[$i][$j] == $array[$i - 1][$j]) {
            echo "(" . $i . ", " . $j . ") and (" . $i - 1 . ", " . $j . ") are the same<br>";
        }
    }
}

这也适用于大于2的子阵列

它的作用: 给定一个二维数组: 它会检查以下两行是否在(x, y), (x - 1, y)中具有相同的数字 它为每个后续行

执行此操作

如果您想为每个可能的行组合执行此操作:

for($i = 0; $i < count($array) - 1; $i++) {
    for($j = $i + 1; $j < count($array); $j++) {
        if($i != $k { //Lets not compare a row with itself
            for($k = 0; $k < count($array[$i]); $k++) {
                if($array[$i][$k] == $array[$j][$k]) {
                    echo "(" . $i . ", " . $k . ") and (" . $j . ", " . $k . ") are the same<br>";
                }
            }
        }
    }
}

答案 1 :(得分:0)

此脚本将为所有元素返回与其前任相同索引的“重复”内容。

它依赖于array_intersect_assoc来检查两个数组是否在相同索引处有任何共同内容。这样,结果将是一个非空数组。收集这些结果,应该是您所需要的。

以下是您可以使用的功能:

function findDuplicates($data) {
    $prev = [null];
    foreach($data as $i => $vector) {
        $same = array_intersect_assoc($vector, $prev);
        if (count($same)) $duplicates[$i] = $same;
        $prev = $vector;
    }
    return $duplicates;
}

您可以使用以下示例数据调用它:

// Sample data
$data = [[0, 1], [2, 1], [4, 3], [3, 1], [3, 1], [4, 3]]; 
$duplicates = findDuplicates($data);

如果你print_r结果,你会得到以下样本数据:

Array (
    [1] => Array ( [1] => 1 )    
    [4] => Array ( [0] => 3 [1] => 1 )
)

此代码也适用于元素多于2的子数组。

答案 2 :(得分:0)

使用简单的foreach循环和sprintf函数尝试以下方法:

$arr = [[0, 1], [2, 1], [4, 3], [3, 1], [4, 1], [4, 5]];

foreach ($arr as $k => $item) {
    if ($k % 2 != 0) {  // perform comparison at each second item
        $prev_key = $k - 1;
        $prev = $arr[$prev_key];  // previous item
        $msg = "items at positions: %d and %d have the same value for the %d%s element. Value: %d". PHP_EOL;
        if ($item[0] == $prev[0]) echo sprintf($msg, $prev_key, $k, 1, 'st', $item[0]);
        if ($item[1] == $prev[1]) echo sprintf($msg, $prev_key, $k, 2, 'nd', $item[1]);
    }
}

输出:

items at positions: 0 and 1 have the same value for the 2nd element. Value: 1
items at positions: 4 and 5 have the same value for the 1st element. Value: 4