[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сравнение двух массивов
Bezdna
В очередной раз застопорился на, вроде, простейшей задаче:

Есть два массива:


array1 =
0 => [ 0 => a, 1 => b, 2 => c, 3 => d, 4 => e],
1 => [ 0 => f, 1 => g, 2 => a, 3 => h, 4 => i];

array2 =
0 => [0 => g, 1 => a, 2 => h];


Нужно найти схождение массивов и одинаковые значения во втором массиве заменить на случайное, при этом второй массив, в любом случае, должен остаться уникальным, т.е., логика, вроде, такая: сравниваем массивы, заменяем дубли, ещё раз проверяем на уникальность и, по необходимости, опять меняем повторяющиеся значения и так до тех пор, пока значения второго массива не станет уникальным, т.е. - ищем дубли, в данном случае "а", меняем на случайное значение, допустим, попалось "d", сравниваем ещё раз, меняем "d" на следующее случайное значение и т.д., до полного несовпадения массивов.

Если со сравнением и заменой проблем нет, то загвоздка заключается в проверке второго массива - кроме многоэтажных циклов, тормозящих систему, в голову ничего не приходит.

Буду благодарен за любую помощь.
Valick
Крайне странная задача, хотелось бы услышать реальную задачу для чего это понадобилось.
1 Для сравнения массивов есть array_intersect() https://www.php.net/manual/ru/function.array-intersect
2 В массив array2 если это возможно необходимо сразу добавить все возможные значения и сделать shuffle(), тогда не придётся добавлять новые уникальные значения. Так же это исключает повторное попадание значения в массив если ранее оно было вырезано.

_____________
Стимулятор ~yoomoney - 41001303250491
Bezdna
А что странного в том, что нужно найти некое значение, не "пересекающееся" с десятками-сотнями подобных значений? В принципе это и есть реальная задача, применение которой, на мой взгляд, может быть в довольно широкой области.

Про array_intersect() я в курсе, может не очень понятно объяснил, но основная проблема в проверке второго массива, который, по логике, нужно проверять рекурсивно, но при большом количестве значений первого массива "садит" систему. Думаю поэтому и добавление всех возможных вариантов посредством shuffle() неприменимо, потому как количество операций вырастет многократно.
YVSIK
Попробовал оживиться сам и поставить плюс в карму, по старой памяти и тут такое, мне это запрещено. хМ.))) blink.gif blink.gif blink.gif

_____________
«Гнусное свойство карликовых умов приписывать
________________!свое духовное убожество другим!»
___
О) как-же он прав=>__________________ © Оноре де Бальзак.

отличный хост(рекомендую !! )
My MVC-CMV
Valick
Цитата (Bezdna @ 23.12.2022 - 22:31)
В принципе это и есть реальная задача, применение которой, на мой взгляд, может быть в довольно широкой области.

Мне не надо "в принципе". Я попросил реальную конкретную задачу и не "найти пересекающееся значение", а то для чего понадобилось это самое непересекающееся значение (мне нужен X, а не Y см. ниже). Безвыигрышная лотерея?
Кроме массивов есть ещё и БД, которые на поисках чего либо "собаку съели".
Поэтому задавать вопрос надо грамотно.
https://tproger.ru/explain/xyproblem/
Цитата
Это ошибка, которая зачастую приводит к бессмысленной трате времени как просящего о помощи, так и тех, кто пытается ему отвечать. Её ещё называют «Проблемой Молотка». Суть её, если коротко, заключается в том, что люди склонны спрашивать о своих неудачных попытках решить проблему, а не о самой проблеме. В итоге получается примерно так:

1 Человек хочет сделать X;
2 Он не знает, как сделать X, но догадывается, что к успеху может привести выполнение Y;
3 Тем не менее человек не знает и то, как сделать Y;
4 В этот момент он решает попросить помощи у других людей;
5 Все пытаются помочь человеку с проблемой Y, удивляясь и не понимая, зачем кому-то вообще это может быть нужно;
6 После длительных расспросов и ценой уймы потерянного времени наконец-то становится понятно, что человек на самом деле хотел решить X, а Y никак ему помочь не сможет.
Bezdna
Вышел я уже из возраста без выигрышных лотерей. А задача - создать некий "костыль", суть которого заключается в том, что есть некая база оборудования, каждой из позиций в которой присвоен уникальный номер, зависящий от типа, модели и т.д.. При добавлении нового оборудования иногда возникает ситуация, что при добавлении похожего эти "уникальные" значения становятся не уникальными, поэтому нужна некая проверка на пересекающиеся значения. Насколько криво это реализовано - обсуждать не будем, ибо переделка в нормальный вид сейчас не рентабельна. Не знаю, насколько эта информация полезна для конечной цели и что-либо изменила в сути задачи.
Valick
За уникальностью id должна следить сама БД.
Но если кривая архитектура, то можно использовать uid
https://www.php.net/manual/ru/function.uniqid.php
там и переделывать то делов на час.

_____________
Стимулятор ~yoomoney - 41001303250491
Bezdna
Если бы была возможность переделать за час, то я бы не тратил уйму времени на "костыли". Пока оставил просто "подсветку" повторяющихся значений, будем редактировать вручную.
YVSIK
array2 = 
0 => [0 => g, 1 => a, 2 => h];

уже все забыл.. о чем это идет речь, попробую вспомнить что-нибудь
Может это тебе поможет
array2 = 
0 => [0 => g,
a,
h];

так будет выбран случайное значение, (что вспомнилось) если что
И далее,
Если уже что-то сделано и получен результат, чего проще-то
надо и результат показать наверное, а писать вопросами или-или - и тем более или, я в этих или уже запутался. а ты предлагаеш еще и код сделать. Собственно не против и могу ошибаться.
Давай по пунктам написать, например вот первое действо, и его результат , далее вторе, уже будет картина проясняться.
а так ка задан вопрос, ну может быть сам уже и запутался...

_____________
«Гнусное свойство карликовых умов приписывать
________________!свое духовное убожество другим!»
___
О) как-же он прав=>__________________ © Оноре де Бальзак.

отличный хост(рекомендую !! )
My MVC-CMV
YVSIK
хм)))
а так:
array2 = 
0 => [0 => g,
a,
h];
1 => [1 => g,
a,
h];
2 => [2=> g,
a,
h];

И ещё если быть придирчивым array2 не бывает только так array а как у тебя написано уже не массив вовсе, это уже переменная какая-то
И ещё, echo так уже будет проход не по значениям а по случайным значениям, и надо будет эти значения уже как то останавливать, но и эти значения могут большой трафик задествовать, выбор надо скажем останавливать числом проходов, уже дело, посчитаем, три значения. умножить сами на себя получается девять проходов, но и тут все не потребуются, значение найдено, можно остановиться на найденном, ещё сократили трафик. Ладно значений много, тогда согласно найденного, останавливаться и проверять что найдено. в отделенном проходе.

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

_____________
«Гнусное свойство карликовых умов приписывать
________________!свое духовное убожество другим!»
___
О) как-же он прав=>__________________ © Оноре де Бальзак.

отличный хост(рекомендую !! )
My MVC-CMV
YVSIK
Цитата (Bezdna @ 22.12.2022 - 02:46)
одинаковые значения во втором массиве заменить на случайное,

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

_____________
«Гнусное свойство карликовых умов приписывать
________________!свое духовное убожество другим!»
___
О) как-же он прав=>__________________ © Оноре де Бальзак.

отличный хост(рекомендую !! )
My MVC-CMV
arbuzmaster
Цитата (Bezdna @ 24.12.2022 - 17:11)
Вышел я уже из возраста без выигрышных лотерей. А задача - создать некий "костыль", суть которого заключается в том, что есть некая база оборудования, каждой из позиций в которой присвоен уникальный номер, зависящий от типа, модели и т.д.. При добавлении нового оборудования иногда возникает ситуация, что при добавлении похожего эти "уникальные" значения становятся не уникальными, поэтому нужна некая проверка на пересекающиеся значения.  Насколько криво это реализовано - обсуждать не будем, ибо переделка в нормальный вид сейчас не рентабельна. Не знаю, насколько эта информация полезна для конечной цели и что-либо изменила в сути задачи.

А зачем тогда массивы перебирать? У тебя есть массив с уникальными ID можно проверять перед добавлением в массив. Ну то есть -
1.добавляем оборудование
2.генерируем ID для него
3. ищем этот ID в массиве с существующем оборудованием
4.1 Если не нашли , добавляем в новый массив (ну или сразу в существующий) - это по выбору
4.2 Если нашли такой же идем на 2 пункт
В общем смысл в том, чтобы проверять перед добавлением в массив, а не после.
так не пойдет?

_____________
Мой первый сайтик

Посмотри на свой XBMC под другим углом
Bezdna
Цитата (arbuzmaster @ 26.12.2022 - 13:20)
так не пойдет?


Суть вопроса в том, что есть изначально корявый скрипт, выдающий информацию именно так, как есть. Поэтому пока желательно обойтись описанным методом сравнения. Данные и проверяется перед созданием массива, проблема в том, что в "новом" массиве может опять оказаться не уникальное значение и перебор готового результата может быть длинным, в связи с чем и возникают "зависания". Т.е., условно - исходные данные "авс", новые "аgh", ищем вхождение, т.е. "a" заменяем другим, случайным значением. Но не факт, что это случайное значение не окажется тем же "а", причём многократно. При этом проблема в том, что вариантов случайного значения не так уж и много, соответственно, "попасть" на многочисленные повторы вероятность довольно высокая.

YVSIK
Цитата (Bezdna @ 26.12.2022 - 16:35)
Цитата (arbuzmaster @ 26.12.2022 - 13:20)
так не пойдет?


Суть вопроса в том,

Суть в том что так писать нельзя!

это колуарный сленг. если можно так сказать.

зАнАю почему все это... ит но не скажу.

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

_____________
«Гнусное свойство карликовых умов приписывать
________________!свое духовное убожество другим!»
___
О) как-же он прав=>__________________ © Оноре де Бальзак.

отличный хост(рекомендую !! )
My MVC-CMV
Bezdna
Цитата (YVSIK @ 27.12.2022 - 08:12)
чем вам майн ответ не угодил


Тем, что там ответы на всё, что угодно, кроме ответа на сам вопрос.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.