Php массивы найти повторяющиеся значения

PHP Найти и отобразить повторяющиеся значения в нескольких массивах

Что вы уже пробовали, какие проблемы вы обнаружили, и с чем вам нужна помощь? Ответы на этот вопрос, вероятно, будут основаны на мнении, что не очень хорошо вписывается в работу сайта.

Тот факт, что вы говорите «лучший путь», заставляет меня согласиться с вышеизложенным. Вы можете легко проверить, находится ли элемент в массиве, используя in_array() . Оттуда попробуйте что-нибудь и задайте вопрос, когда вы застряли.

Я думаю, у вас есть ответ на ваш вопрос. Вы хотите что-то вроде domain.com => array 1, array 2, array 3 . Поэтому создайте массив с доменами в качестве ключей. Выполните итерацию ваших 3 (или более) массивов и заполните новый массив во время итерации. Вам придется повторять каждый массив ровно один раз. Ваша окончательная структура будет выглядеть примерно как этот array( ‘domain.com’ => array( ‘array 1’, ‘array 2’, ‘array 3’), ‘domain5.com’ => . )

5 ответов

Идея этого кода проста:) Для каждой записи во всех представленных массивах функция сначала записывает искусственное имя массива контейнеров в массиве $raw , а затем удаляет записи, не имеющие более одного в этом массиве.

 $i++; > > $out = array(); foreach($raw as $key => $value) < if(count($value)>1) $out[$key] = $value; > return $out; > echo '
'; print_r( duplicates( array('domain.com','domain1.com','domain2.com','domain3.com','domain5.com','domaindd5.com'), array('domain.com','domain12.com','domain22.com','domain32.com','domain42.com','domain5.com'), array('domain.com','domain31.com','domain332.com','domain33.com','domain5.com','domaindd5.com') ) ); echo '

'; ?>

Благодаря функции func_get_args() вы можете предоставить произвольное количество входных массивов функции duplicates() выше. Вот вывод кода выше:

Array ( [domain.com] => Array ( [0] => array 1 [1] => array 2 [2] => array 3 ) [domain5.com] => Array ( [0] => array 1 [1] => array 2 [2] => array 3 ) [domaindd5.com] => Array ( [0] => array 1 [1] => array 3 ) ) 

Возвращает массив, содержащий все значения в массиве 1, значения которого существуют во всех параметрах.

 $array2 = array('domain.com','domain12.com','domain22.com','domain32.com','domain42.com','domain5.com'); $array3 = array('domain.com','domain31.com','domain332.com','domain33.com','domain5.com','domaindd5.com'); $duplicate = array_intersect(array_intersect($array1,$array2),$array3); 

Массив ([0] = > domain.com [4] = > domain5.com)

Если вам нравится программирование функций, вот несколько сжатый метод/однострочный:

$array1 = array('domain.com','domain1.com','domain2.com','domain3.com','domain5.com','domaindd5.com'); $array2 = array('domain.com','domain12.com','domain22.com','domain32.com','domain42.com','domain5.com'); $array3 = array('domain.com','domain31.com','domain332.com','domain33.com','domain5.com','domaindd5.com'); var_export(array_filter(array_merge_recursive(array_fill_keys($array1,'array1'),array_fill_keys($array2,'array2'),array_fill_keys($array3,'array3')),'is_array')); 
array ( 'domain.com' => array ( 0 => 'array1', 1 => 'array2', 2 => 'array3', ), 'domain5.com' => array ( 0 => 'array1', 1 => 'array2', 2 => 'array3', ), 'domaindd5.com' => array ( 0 => 'array1', 1 => 'array3', ), ) 

Я не имею права говорить с вами о производительности nlogn , но я думаю, что это очень ценно с точки зрения краткости.

Вот разбивка на несколько строк:

var_export( array_filter( array_merge_recursive( array_fill_keys($array1,'array1'), // ["domain.com"=>"array1","domain1.com"=>"array1". ] array_fill_keys($array2,'array2'), array_fill_keys($array3,'array3') ), 'is_array' ) ); 
  • array_fill_keys() будет генерировать массив со значениями «[. ]. com» в качестве ключей и «имена переменных массива» в качестве статических значений.
  • array_merge_recursive() объединит три сгенерированных массива в один массив. Дублированные ключи будут иметь свои значения, объединенные в подмассивы, в то время как уникальные ключи будут хранить свои данные в виде строки.
  • array_filter() просто удалит уникальные «[. ]. com» вхождения, сохранив только значения с типом данных array .

В приведенных здесь массивах $array1 , $array2 , $array3 я предполагаю, что повторения в одном массиве нет.

Таким образом, выполняются две задачи:

  • Найти дубликаты в других массивах.
  • Создайте массив, содержащий имя, где происходит повторение.
$final = []; // initialize the final array foreach(array_merge($array1,$array2,$array3) as $domain) $final[] = $domain; // group all array elements unset($domain); // unset garbage after foreach execution 

Теперь у нас есть список всех элементов массивов, собранных в $final .

$final = array_count_values($final); // find repetition and its count $final = array_diff($final, [1]); // remove single occurances 

Теперь окончательный будет выглядеть так: имя домена как ключ и количество повторений во всех массивах.

array ( 'domain.com' => 3, 'domain5.com' => 3, 'domaindd5.com' => 2, ) 

Теперь найдите, где происходит повторение в данных 3 массивах

foreach($final as $domain => &$count) < $count = []; // make count an array $temp1 = in_array($domain, $array1); // check if it is in $array1 $temp2 = in_array($domain, $array2); // check if it is in $array2 $temp3 = in_array($domain, $array3); // check if it is in $array3 if($temp1 !== false) // if in array then fill array name $count[] = 'array1'; if($temp2 !== false) $count[] = 'array2'; if($temp3 !== false) $count[] = 'array3'; >unset($domain, $count); // unset garbage 

Вот и все, ваш массив $final будет выглядеть,

array ( 'domain.com' => array ( 0 => 'array1', 1 => 'array2', 2 => 'array3', ), 'domain5.com' => array ( 0 => 'array1', 1 => 'array2', 2 => 'array3', ), 'domaindd5.com' => array ( 0 => 'array1', 1 => 'array3', ), ) 

Вы действительно заинтересовали меня (немного слишком заинтересованы). Решение влечет за собой итерацию с помощью отсортированных массивов, и не имеет значения, к какому length относятся массивы. Возможно, вам придется изменить код в зависимости от вашего ввода, но основные понятия одинаковы. Вы также можете сделать его более интуитивно понятным, добавив цикл foreach , чтобы сделать пару для вас (объяснено ниже). Вот что я смог придумать:

Предложение O(nlogn) алгоритм сложности

Другое решение и несколько других онлайн показывают некоторые способы его выполнения, используя сложность O(n^2) . Я думаю, что мы можем сделать лучше, потому что это можно решить аналогичным образом с помощью процесса divide-and-conquer , выполняемого во многих O(nlogn) сортах.

Краткое описание

Это алгоритм времени выполнения O(nlogn) , который сортирует массивы и затем перебирает их каждый раз, продвигая указатель массива в меньшем массиве (тот, который имеет нижний элемент current() ), пытаясь найти любые дубликаты. Сортировка O(logn) выполняется с использованием метода PHP sort .

Сортировка массивов

Метод сортировки будет использовать sort и сохранит переменную $max_length для итерации массивов позже. Этот процесс O(logn) , где n — размер ввода массивов для сортировки. Здесь мы помещаем все три массива в массив и прокладываем через него, чтобы отсортировать их. (Это делается, если не все массивы имеют одинаковую длину)

Итерация для поиска дубликатов

Эта часть немного iffy (я надеюсь, что какой-нибудь эксперт по вычислительной технике может помочь мне здесь немного, чтобы сделать это быстрее, так как я думаю, что это может быть быстрее). Мы правильно отсортировали массивы. Сколько итераций нам нужно делать? Ну, ответ, это зависит! Если мы выполняем итерацию array1 для проверки дубликатов в array2 , нам нужно выполнить итерацию до достижения наибольшего элемента (в array1 и array2 ). Поскольку мы можем сказать, что array1 имеет самый большой элемент (вы делаете это через. max() в PHP, но в этом вы можете сказать по буквам (все элементы начинаются с домена, а буквы больше, чем числа)., все, что нам нужно сделать, это выяснить, какое максимальное значение нам нужно достичь, чтобы мы не пропустили какие-либо элементы (например, если бы мы просто сделали итерацию максимальной длины, вычислив количество элементов в массиве с помощью наибольший элемент, мы пропустили бы некоторые элементы, поскольку цикл может закончиться, прежде чем мы закончим увеличивать другой меньший массив, поскольку этот массив может иметь много небольших элементов). Теперь нам нужен весь парад возможностей для сравнения (array1 → array2, array1 → array3, array2 → array3) и итерации против них. С каждой итерацией мы проверим, находится ли текущий элемент, который мы смотрим, больше, чем текущий элемент в другом массиве. Если это так, мы будем продвигать указатель массива в меньшем, иначе в другом массиве. Делая это, мы гарантируем, что мы посетим каждый элемент, пока этот элемент не станет таким же (в этом случае мы достигнем блока else , так как оба элемента одинаковы). Вы можете узнать больше об этой стратегии: Алгоритм, чтобы определить, имеют ли два массива одинаковые элементы

Для каждого завершения цикла while мы reset указатели массива в обоих массивах, чтобы подготовить его для следующего сравнения.

$end_of_array1 = end($array1); reset($array1); while (current($array1) != $end_of_array1) < if (current($array1) >current($array2)) < next($array2) || end($array2); >elseif (current($array1) < current($array2)) < next($array1) || end($array1); >else < //Array intersection, values are matching if (isset($duplicates[current($array1)])) < array_push($duplicates[current($array1)], 'array1', 'array2'); >else < $duplicates[current($array1)] = array('array1', 'array2'); >next($array1); next($array2); > > reset($array1); $end_of_array3 = end($array3); reset($array1); reset($array2); reset($array3); while (current($array3) != $end_of_array3) < if (current($array1) >current($array3)) < next($array3) || end($array3); >elseif (current($array1) < current($array3)) < next($array1) || end($array1); >else < //Array intersection, values are matching if (isset($duplicates[current($array1)])) < array_push($duplicates[current($array1)], 'array1', 'array3'); >else < $duplicates[current($array1)] = array('array1', 'array3'); >next($array1); next($array3); > > reset($array2); reset($array3); while (current($array3) != $end_of_array3) < if (current($array2) >current($array3)) < next($array3) || end($array3); >elseif (current($array2) < current($array3)) < next($array2) || end($array2); >else < //Array intersection, values are matching if (isset($duplicates[current($array2)])) < array_push($duplicates[current($array2)], 'array2', 'array3'); >else < $duplicates[current($array2)] = array('array2', 'array3'); >next($array2); next($array3); > > foreach ($duplicates as $key=>$array) < $duplicates[$key] = array_unique($array); >print_r($duplicates); 

$duplicates необходимо удалить и стать уникальным, так как мы выталкивали из него множество «array1» и «array3». Как только это будет завершено, мы достигнем всех дублированных элементов.

tl; dr и окончательные примечания

Ниже приведен полный код, и вы можете запустить здесь, чтобы получить те же результаты

 current($array2)) < next($array2) || end($array2); >elseif (current($array1) < current($array2)) < next($array1) || end($array1); >else < //Array intersection, values are matching if (isset($duplicates[current($array1)])) < array_push($duplicates[current($array1)], 'array1', 'array2'); >else < $duplicates[current($array1)] = array('array1', 'array2'); >next($array1); next($array2); > > reset($array1); $end_of_array3 = end($array3); reset($array1); reset($array2); reset($array3); while (current($array3) != $end_of_array3)< //echo 'current value of array1 :' . current($array1) . ' current value of array3: ' . current($array3). '
'; if (current($array1) > current($array3)) < next($array3) || end($array3); >elseif (current($array1) < current($array3)) < next($array1) || end($array1); >else < //Array intersection, values are matching if (isset($duplicates[current($array1)])) < array_push($duplicates[current($array1)], 'array1', 'array3'); >else < $duplicates[current($array1)] = array('array1', 'array3'); >next($array1); next($array3); > > reset($array2); reset($array3); while (current($array3) != $end_of_array3) < if (current($array2) >current($array3)) < next($array3) || end($array3); >elseif (current($array2) < current($array3)) < next($array2) || end($array2); >else < //Array intersection, values are matching if (isset($duplicates[current($array2)])) < array_push($duplicates[current($array2)], 'array2', 'array3'); >else < $duplicates[current($array2)] = array('array2', 'array3'); >next($array2); next($array3); > > foreach ($duplicates as $key=>$array) < $duplicates[$key] = array_unique($array); >print_r($duplicates); ?>

Источник

Как найти значение, повторяющееся в массивах PHP?

Добрый день! Есть, допустим, 10 массивов. Задача – найти значения, которые встречаются как минимум в трех массивах и добавить их в отдельный массив. Как это лучше реализовать? Спасибо!

FanatPHP

Правильный ответ: перестать заниматься ерундой и научиться, наконец, работать с базой данных.
Буквальный ответ: любые операции с массивами производятся с помощью циклов.

Любые операции с массивами могут реализовываться с помощью циклов. Но под сотню функций для работы с массивами в PHP реализовано именно для того, чтобы пользователи пореже писали непроизводительные многократные обходы массивов для типовых задач.

FanatPHP

не надо писать ерунды. если человек не в состоянии написать производительный однократный обход массива, то никакой синтаксический сахар ему не поможет.

conf

Небольшой совет: всегда давайте контекст в котором вы решаете задачу, иначе вы можете решать какую-то свою придуманную проблему, а настоящая задача совсем решается по-другому.
По поводу вашего вопроса — читайте документацию, там все есть:

php > $one = ['red']; $two = ['red', 'green', 'blue']; $three = ['red', 'blue']; php > var_dump(array_intersect($one, $two, $three)); array(1) < [0]=>string(3) "red" >

Вам остается в цикле подсчитать кол-во комбинаций из 10 по 3 и использовать вышеприведенную функцию, либо сообщить нам о том, что вы все-таки пытаетесь сделать и тогда, наверняка, найдется менее костыльное решение.

//$arrays - исходный список массивов $count=array(); $new=array(); foreach ($arrays as $a) < foreach ($a as $key=>$i) < $count[$key]++; if ($count[$key]===3) > >

Войдите, чтобы написать ответ

Возможно ли на php создать асинхронный парсер?

Источник

Поиск одинаковых элементов в массиве. Точнее, сколько каких значений

Есть массив, $ara[1],$ara[2].. $ara[n]
Нужно найти одинаковые записи, и показать, сколько каких записей есть в массиве.
Точнее, если есть 3 одинаковых значения, то выполнить некоторое действие с этим значением.

Чет додуплить не могу алгоритм).. Помогите плз :З

Поиск одинаковых значений в массиве
Привет всем, есть такая вот задача: Есть массив с n-ным количеством элементов. Нужно найти все.

Поиск одинаковых значений в массиве
На форме есть несколько текстбоксов, объединённые в массив tb, в каждом из них введены числа через.

Поиск одинаковых значений в массиве
Здравствуйте уважаемые. Есть одна задачка по поиску одинаковых значений в массиве и определения их.

Поиск двух одинаковых минимальных значений в массиве
Условие: дан массив U(1). U(15). В нем есть два одинаковых Umin. Определить их индексы. .

Лучший ответ

Сообщение было отмечено AinurKA29 как решение

Решение

$a=array(1,2,4,2,3,4,1,2); $b=array(); foreach($a as $k=>$v) { if(isset($b[$v])) { $b[$v]++; if($b[$v]==3) echo 'Найдено 3 одинаковых значения: '.$v; } else $b[$v]=1; }

Источник

Читайте также:  Python telegram chat not found
Оцените статью