|
0 / 0 / 0
Регистрация: 14.09.2014
Сообщений: 10
|
|
Найти совпадение элемента одного массива в другом11.10.2015, 14:53. Показов 16133. Ответов 7
Метки нет (Все метки)
Есть две базы данных MySQL. Нужно выбрать значения нескольких полей из одной и сравнить эти значения с полями другой базы, при наличии совпадения с этими элементами массива будут проводиться корректировки. То есть, задача — вытянуть из базы данных эти значения и записать их в массив (это сделано), а далее нужно, насколько я понимаю, в цикле сравнить значение одного элемента массива со всеми значениями элементов нескольких массивов, то есть, осуществить поиск этого элемента во втором массиве.Как это правильно написать на php?
0
|
|
| 11.10.2015, 14:53 | |
|
Ответы с готовыми решениями:
7
Найти порядковый номер элемента одного массива равного первому числа в другом массиве поиск одного элемента массива в другом Найти элементы одного массива в другом |
|
81 / 81 / 50
Регистрация: 26.11.2012
Сообщений: 303
|
||||||
| 11.10.2015, 17:34 | ||||||
1
|
||||||
|
0 / 0 / 0
Регистрация: 14.09.2014
Сообщений: 10
|
||||||
| 15.10.2015, 10:47 [ТС] | ||||||
|
Попробовал выполнить через цикл while, но не получилось. Скорее всего я что то делаю не так,(я только изучаю php) посмотрите пожалуйста.
0
|
||||||
|
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
|
|
| 15.10.2015, 10:50 | |
|
а http://php.net/manual/ru/function.in-array.php не подойдет?
1
|
|
|
0 / 0 / 0
Регистрация: 14.09.2014
Сообщений: 10
|
|
| 15.10.2015, 10:54 [ТС] | |
|
Подойдет, но проблема не в том, как проверить совпадение, а в том что массивов более 1000 и нужно перебрать каждый, у меня не получается сделать перебор, чтобы элемент массива из первой базы сравнить со всеми массивами второй базы данных.
0
|
|
| 15.10.2015, 11:30 | |||||||||||
|
1. сделайте уникальный ключ в целевой таблице по тем колонкам, которые его составляют.
2. экспортируйте старую таблицу в sql файл, замените названия полей на новые (в любом редакторе простой заменой) 3. залейте этот файл в новую таблицу. это чтобы просто избавиться от дупликатов. Если нужно обработать сами поля как-то, и записей действительно довольно много, то изучайте всякие разные функции mysql-я, егошный sql вообщем-то составляет тьюринг-полный язык, так что можно и на нем обработать как угодно. Для этого в конце каждого запроса (тоже делается простой заменой символа окончания строки или что-нибудь в этом роде) приписываете
Не по теме: простая конкатенация этих полей и занесение в ассоциаивный массив как ключей. значениями может быть что угодно. Проверка на то, есть или нет такая запись, делается вызовом оператора isset(). Итоговая сложность O(m+n) (количество записей в одной таблице+количество в другой, поиск по хеш-таблице амортизированно константен), что в итоге вам даст возможность обработать довольно приличное количество записей за достаточно небольшое время. примерный "псевдокод" того, о чем я:
1
|
|||||||||||
|
0 / 0 / 0
Регистрация: 14.09.2014
Сообщений: 10
|
|
| 15.10.2015, 12:13 [ТС] | |
|
Подскажите, а мой вариант кода как то можно в чувства привести? Или он кардинально не верен?
0
|
|
| 15.10.2015, 13:31 | |||||||||||
|
сложно сказать, кардинально или нет, но так или иначе в вашем коде есть неудачные решения, из-за которых, по крайней мере потенциально, это дело может не работать.
первое, и пожалуй, самое главное, что я вижу, вы в цикле пытаетесь сделать еще один цикл по таблице. в mysql есть, конечно, кеш и все такое, но итерация по всем записям -- это по-хорошему, обращение к диску, и это долго. и так каждый раз, при чтении одной записи из новой таблицы, вы, видимо, хотели, проходиться по старой. Это долго и вы это делаете неправильно. Второе. Чтобы сделать это правильно, вам на каждой итерации нужно очищать массив $row_old, и делать запрос
Третье. Так действительно можно делать, и иногда это является хорошим решением, когда скорость вам неважна и вы очень сильно ограничены по памяти, что не можете себе позволить считать всю таблицу в массив. Пару тысяч записей, скорее всего, без проблем в нее влезут (хотя, конечно, зависит от размера еще и самих записей). Даже если вам и покажет ошибку, не унывайте, сначала увеличьте объем доступной памяти для скрипта, например:
В-четвертых, не забывайте, что в вашем случае, помимо лишних обращений к диску, вам на каждую запись из одной таблицы придется просматривать все записи из другой. Это сложность O(n*m). Если уж так хочется поэкономить память, я бы на вашем месте сделал индекс по столбцу(ам), которые вы проверяете на совпадения (и тут уже не так важно, уникальные или нет), и в цикле каждый раз делал бы запрос, пытаясь выбрать запись, "похожую" (по вашим критериям) на запись из новой. В вашем случае, как я понимаю, вы смотрите только по столбцу publish_up, соответственно повесить на него индекс, если его еще нет, и вместо вложенного цикла поставить запрос на выборку по этому publish_up -- и вуаля, будут сразу все похожие записи на эту "новую", с учетом вашего критерия. а по ним уже можно и цикл, это уж как хотите. Причем средняя сложность будет уже O(n * log(m)), что намного лучше O(n*m). В-пятых, если все же память вам не так важна, а критерии действительно сложные, и не хочется изучать mysql-операторы, то проще будет считать все записи и из первой и из второй таблицы в память, а потом их анализировать уже на уровне приложения, например, тем способом, который предложили в первом ответе. Да, тут сложность останется O(n*m), но тут хотябы вы будете работать с памятью, а не с диском, и это тоже может быть достаточно быстро (опять же, если у вас по 1-2к записей в обеих таблицах, а не десятки-сотни тысяч). Это и делается проще, и ничего непонятного не придется городить -- просто два цикла, читаете в память, анализируете. а дальше уже можно и вложенными пользоваться. В-шестых, расширение mysql уже давным давно deprecated так что пользуйтесь либо mysqli, либо PDO, тем более что они удобнее зачастую, да и те и другие имеют практически полные аналоги функций mysql_* . Так что в любом случае рекомендую вам переписать код
1
|
|||||||||||
| 15.10.2015, 13:31 | |
|
Помогаю со студенческими работами здесь
8
Как найти все значения одного массива в другом многомерном массиве?
Как проверить наличие одного элемента в другом? Поиск элементов одного массива в другом Определить наличие элементов одного массива в другом Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|