$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";
答案 0 :(得分:3)
只要有重复,我的所有方法都会返回所需的结果。由于您的样本输入,也假设数组中只有1个重复。我的方法(以及此页面上的其他答案)之间的差异对于您的输入大小最多为毫秒。由于您的用户无法区分此页面上的任何正确方法,因此我建议您实施的方法应由"可读性","简单"来确定和/或"简洁"。有许多编码器总是默认为/ foreach / while循环。还有其他人总是遵从功能迭代器。您的选择可能只会降低到您的编码风格"。
输入:
$arr=[1,1,2,3,4];
方法#1 :README
,array_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_flip,array_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
当然,如果您想知道该对的 ,只需将上述函数中的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>";
}
}