Php 查找数组中相等的两个值

Php 查找数组中相等的两个值,php,arrays,duplicates,Php,Arrays,Duplicates,如何从该数组中找到该对? 请记住,数组中的对可以是任意数字(1,2,4,3,2)或(3,3,1,2,4);我只是随便举一个例子 $arr = array( 1, 1, 2, 3, 4 ); 首先检查数组,然后检查连续索引上是否有两个值相同的数字 这是最有效的解决方案:排序是在O(n log n)time1中完成的,而检查需要O(n)时间。总的来说,您将在O(n logn)时间内得到答案。简单的方法将使用O(n2)时间 如果不想修改原始数组,请在副本上执行上述所有操作 if the

如何从该数组中找到该对?
请记住,数组中的对可以是任意数字(1,2,4,3,2)或(3,3,1,2,4);我只是随便举一个例子

 $arr = array(
     1, 1, 2, 3, 4
 );
首先检查数组,然后检查连续索引上是否有两个值相同的数字

这是最有效的解决方案:排序是在O(n log n)time1中完成的,而检查需要O(n)时间。总的来说,您将在O(n logn)时间内得到答案。简单的方法将使用O(n2)时间

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

if there is a pair in array
   echo "The pair number is 1";
函数hasEqualPair($arr){
排序($arr);
$l=计数($arr);
对于($i=1;$i<$l;++$i){
如果($arr[$i]==$arr[$i-1]){
返回true;
}
}
返回false;
}
变量转储(hasEqualPair(数组(1,2,4,3,2));//真的
变量转储(hasEqualPair(数组(1,1,2,3,4));//真的
变量转储(hasEqualPair(数组(3,3,1,2,4));//真的
变量转储(hasEqualPair(数组(3,5,1,2,4));//假的

当然,如果您想知道这对是什么,只需将上述函数中的
return true
更改为
return$arr[$i]
。然后,您可能还需要将函数名更改为
getEqualPair


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

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

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
使用内置的。然后迭代结果并检查计数是否大于1

$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;
            }
        }
    }
}

只要有重复的,我的所有方法都将返回所需的结果。由于您的示例输入,还假定数组中只有1个重复项。对于您的输入大小,我的方法(和本页上的其他答案)之间的差异最多为毫秒。由于您的用户无法区分此页面上的任何正确方法,因此我建议您实现的方法应根据“可读性”、“简单性”和/或“简洁性”确定。有许多程序员总是默认使用for/foreach/while循环。还有一些人总是遵从函数迭代器。您的选择可能会归结为“您的编码风格”

输入:

$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;
    }
}
方法#1

说明:生成值引用的新数组,按引用从高到低排序新数组,返回键


方法#2

说明:生成值出现的数组,过滤掉
1
,返回单键


方法#3

说明:删除重复项并保留键,查找丢失的元素,返回唯一值

阅读后的进一步思考:我最喜欢的两功能一行程序的答案是

方法4

说明:统计出现次数(生成值的键),交换键和值(创建2元素数组),无需函数调用即可访问
2
键。快聪明

如果您想实现方法4,可以编写如下内容:()


从所有答案中可以看出,有很多方法可以实现您想要的结果,但我就到此为止。

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

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

$arr=array(
1, 1, 2, 3, 4
);
回声“;
$VAL=数组计数值($arr);
foreach($VAL作为$key=>$value){
如果($value%2==0){
echo“配对号为“$key”。
”; }否则{ echo“非对编号为“$key”。
”; } }
这是
数组\u计数\u值
可能有多对吗?你要全部的还是第一双?总会有一对吗?@mickmackusa只有一对。
$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
echo key(array_filter(array_count_values($arr),function($v){return $v!=1;}));
// if no duplicate, this will return null
echo current(array_diff_key($arr,array_unique($arr)));
// if no duplicate, this will return false
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
$dupe=@array_flip(array_count_values($arr))[2];
if($dupe!==null){
    echo "The pair number is $dupe";
}else{
    echo "There were no pairs";
}
<?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>";
    }
}
?>
$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>"; 
    }

}