$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";
Все мои методы будут возвращать желаемый результат, пока есть дубликат. Также предполагается, что из вашего входного образца в массиве есть только 1 дубликат. Разница между моими методами (и другими ответами на этой странице) будет не более миллисекунд для вашего размера ввода. Поскольку ваши пользователи не смогут различить ни один из правильных методов на этой странице, я предложу, чтобы метод, который вы реализуете, определялся по «удобочитаемости», «простоте» и / или «краткости». Есть много кодеров, которые по умолчанию всегда используют циклы for / foreach / while. Есть другие, которые всегда отдают предпочтение функциональным итераторам. Ваш выбор, вероятно, просто сводится к «вашему стилю кодирования».
Входные данные:
$arr=[1,1,2,3,4];
Способ № 1: 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: 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: array_unique (), array_diff_key (), ток()
echo current(array_diff_key($arr,array_unique($arr)));
// if no duplicate, this will return false
Объяснение: удалите дубликаты и сохраните ключи, найдите пропавший элемент, верните одиночное значение.
Дальнейшее рассмотрение после прочтения: https://www.exakat.io/avoid-array_unique/ и принятый ответ от array_unique vs array_flip У меня есть новый любимый 2-х функциональный однострочный …
Способ № 4: array_count_values (), array_flip ()
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, вы можете написать что-то вроде этого 🙁демонстрация)
$dupe=@array_flip(array_count_values($arr))[2];
if($dupe!==null){
echo "The pair number is $dupe";
}else{
echo "There were no pairs";
}
Будет много способов достичь желаемого результата, как вы можете видеть из всех ответов, но я на этом остановлюсь.
Сначала отсортируйте ваш массив, затем используйте цикл 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;
}
}
}
}
Используйте встроенный array_count_values
. Затем переберите результаты и проверьте, больше ли 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;
}
}
Сначала вы можете посчитать все значения в массиве, а затем для каждого отдельного значения проверить, встречается ли оно дважды в массиве.
<?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>";
}
}
?>
Первый Сортировать массив, затем проверьте, есть ли два числа в последовательных индексах с одинаковым значением.
Это наиболее эффективное решение: сортировка производится в O (n log n) время1 и делает проверку принимает На) время. В целом, у вас будет ответ в O (n log 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 sort
функция в PHP использует Quicksort. Можно сделать так, чтобы всегда бегал в O (n log n) время, но реализация в PHP, вероятно, имеет среднее время выполнения O (n log n), с худшим временем работы все еще На2).
$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>";
}
}