找到两个在数组中相等的值

时间:2017-05-24 13:36:18

标签: php arrays duplicates

 $arr = array(
     1, 1, 2, 3, 4
 );

如何从这个数组中找出这对? 请记住,数组中的对可以是任意数字(1,2,4,3,2)或(3,3,1,2,4);我只是在上面给出一个随机的例子。

if there is a pair in array
   echo "The pair number is 1";

6 个答案:

答案 0 :(得分:3)

只要有重复,我的所有方法都会返回所需的结果。由于您的样本输入,也假设数组中只有1个重复。我的方法(以及此页面上的其他答案)之间的差异对于您的输入大小最多为毫秒。由于您的用户无法区分此页面上的任何正确方法,因此我建议您实施的方法应由"可读性","简单"来确定和/或"简洁"。有许多编码器总是默认为/ foreach / while循环。还有其他人总是遵从功能迭代器。您的选择可能只会降低到您的编码风格"。

输入:

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

方法#1 READMEarray_count_values()arsort()

$result=array_count_values($arr);
arsort($result);                 // this doesn't return an array, so cannot be nested
echo key($result);
// if no duplicate, this will return the first value from the input array

说明:生成新的值出现数组,按出现次数从最高到最低排序新数组,返回键。

方法#2 key()array_count_values()array_filter()

echo key(array_filter(array_count_values($arr),function($v){return $v!=1;}));
// if no duplicate, this will return null

说明:生成值出现的数组,过滤掉1,返回单独的密钥。

方法#3 key()array_unique()array_diff_key()

echo current(array_diff_key($arr,array_unique($arr)));
// if no duplicate, this will return false

说明:删除重复项并保留键,找到丢失的元素,返回单独的值。

阅读后进一步考虑:current()以及https://www.exakat.io/avoid-array_unique/接受的答案我有一个新的最喜欢的双功能单行...

方法#4 array_unique vs array_fliparray_count_values()

echo array_flip(array_count_values($arr))[2];
  // if no duplicate, this will show a notice because it is trying to access a non-existent element
  // you can use a suppressor '@' like this:
  // echo @array_flip(array_count_values($arr))[2];
  // this will return null on no duplicate

说明:计算出现次数(生成值的键),交换键和值(创建一个2元素数组),在没有函数调用的情况下访问2键。快速智能!

如果你想实现方法#4,你可以这样写:(array_flip()

$dupe=@array_flip(array_count_values($arr))[2];
if($dupe!==null){
    echo "The pair number is $dupe";
}else{
    echo "There were no pairs";
}

从所有答案中可以看出,有很多方法可以达到你想要的结果,但我会在这里停下来。

答案 1 :(得分:1)

首先对你的数组进行排序,然后使用foreach循环,如果current和next相等,并且在此之前不回显此项,则echo项是对的。

$arr = array(
     1, 3, 1, 2, 2, 2, 3, 4
 );

sort($arr);

$last_number = null;
foreach($arr as $key => $item) {
    if(array_key_exists($key + 1, $arr)) {
        if($item === $arr[$key + 1]) {
            if($last_number !== $item) {//prevent duplicate echo pair of one item
                echo 'The pair number is ' . $item;
                $last_number = $item;
            }
        }
    }
}

答案 2 :(得分:1)

使用内置array_count_values。然后迭代结果并检查count是否大于1.

$arr = array(
    1, 1, 2, 3, 4
);
$values = array_count_values($arr);
foreach ($values as $key => $value) {
    if ($value > 1) {
        echo 'Pair: ' . $key;
        // break, if you need to show first pair only
        // break;
    }
}

答案 3 :(得分:1)

您可以先计算数组中的所有值,然后对每个不同的值检查它是否在数组中出现两次。

<?php 
$array = array(1, 1, 2, 3, 4);
$vars = array_count_values($array);

foreach($vars as $key => $var) {
    if($var == 2) {
        echo "The pair number is " . $key . "<br>";
    }
}
?>

答案 4 :(得分:0)

首先sort数组,然后检查连续索引上是否有两个具有相同值的数字。

这是最有效的解决方案:排序在 O(n log n)时间 1 完成,并且检查需要 O(n) O(n log n)时间内得到答案。天真的方法将使用 O(n 2 时间。

如果您不想修改原始数组,请在副本上执行以上所有操作。

function hasEqualPair($arr) {
    sort($arr);
    $l = count($arr);
    for ($i = 1; $i < $l; ++$i) {
        if ($arr[$i] === $arr[$i - 1]) {
            return true;
        }
    }
    return false;
}

var_dump(hasEqualPair(array(1, 2, 4, 3, 2))); // true
var_dump(hasEqualPair(array(1, 1, 2, 3, 4))); // true
var_dump(hasEqualPair(array(3, 3, 1, 2, 4))); // true
var_dump(hasEqualPair(array(3, 5, 1, 2, 4))); // false

Try it online!

当然,如果您想知道该对的 ,只需将上述函数中的return true更改为return $arr[$i]即可。然后,您可能还希望将函数名称更改为getEqualPair

1 PHP中的sort函数使用Quicksort。可以使它始终在 O(n log n)时间运行,但PHP中的实现可能具有 O(n log n)的平均运行时间,在最坏情况下运行时间仍 O(n 2

答案 5 :(得分:0)

$arr = array(
     1, 1, 2, 3, 4
 );
 echo "<pre>";          
$vals = array_count_values($arr);
foreach ($vals as $key => $value) {
    if($value%2==0){
        echo "The pair number is ".$key."<br>"; 
    }else{
        echo "The not pair number is ".$key."<br>"; 
    }

}