【问题标题】:PHP - Comparing every two values of an arrayPHP - 比较数组的每两个值
【发布时间】:2016-05-15 17:33:50
【问题描述】:

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

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),然后应该比较第二对键值(在示例中- 两者 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";
        }
    }
}

欢迎和赞赏每一个建议!

【问题讨论】:

  • 你想要什么结果?
  • 我不确定我的解释是否正确。???不清楚你想要什么。
  • 对于初学者来说,简单的是或否就足够了。
  • 是/否什么?没有问题。
  • 问题在哪里,comared

标签: php arrays multidimensional-array compare


【解决方案1】:

此脚本将为所有元素返回它们在与它们的前辈相同的索引处具有的“重复”内容。

它依赖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 个的子数组。

【讨论】:

  • 如果我想对整个元素进行比较,它就完美了。第一个元素([0, 1])和第二个元素([2, 1]) - 应该返回一个假(例如),因为 0 和 2 不相等,但应该为 1 和 1 返回真。重点不是要比较整个元素。因此我尝试使用三维数组。
  • 你的问题不是很清楚。我会在一分钟内更新。您能否在问题中提供您需要的输出示例。
  • 我更正了修改后的答案中的一个错误。代码应该使用array_intersect_assoc 函数,而不是我之前的函数。对这个故障感到抱歉。
【解决方案2】:

使用简单的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

【讨论】:

    【解决方案3】:

    将数组Array ( [0] =&gt; Array ( [0] =&gt; 0 [1] =&gt; 1 ) [1] =&gt; Array ( [0] =&gt; 2 [1] =&gt; 1 ) [2] =&gt; Array ( [0] =&gt; 4 [1] =&gt; 3 ) [3] =&gt; Array ( [0] =&gt; 3 [1] =&gt; 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>";
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 我希望比较的是第一个和第二个元素,第三个和第四个,第五个 - 第六个......这就是整个问题。
    • 给出的脚本会像这样比较它: Array ( [0] => Array ( [0] => 1 [1] => 2 ) [1] => Array ( [0] = > 3 [1] => 4 ) [2] => 数组 ( [0] => 5 [1] => 6 ) [3] => 数组 ( [0] => 7 [1] => 8 ) 1 == 3 2 == 4 5 == 7 6 == 8
    • 我的第一个脚本的输出是前一个脚本的每一行。从第二个脚本(在通知未定义变量 $k 之后)是每一行与所有其他行。有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多