Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/76: Рейтинг темы: голосов - 76, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 14.09.2014
Сообщений: 10

Найти совпадение элемента одного массива в другом

11.10.2015, 14:53. Показов 16133. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть две базы данных MySQL. Нужно выбрать значения нескольких полей из одной и сравнить эти значения с полями другой базы, при наличии совпадения с этими элементами массива будут проводиться корректировки. То есть, задача — вытянуть из базы данных эти значения и записать их в массив (это сделано), а далее нужно, насколько я понимаю, в цикле сравнить значение одного элемента массива со всеми значениями элементов нескольких массивов, то есть, осуществить поиск этого элемента во втором массиве.Как это правильно написать на php?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.10.2015, 14:53
Ответы с готовыми решениями:

Найти порядковый номер элемента одного массива равного первому числа в другом массиве
Добрый день! подскажите пожалуйста. даны два массива как найти порядковый номер элемента одного массива равного первому числа в другом...

поиск одного элемента массива в другом
Задача. Есть массив данных massiv1.= 2,3,4,5 есть массив2 = 5,6,t,o,3 массив3 = 1,9,3,4 нужно, если в массиве два,, элемент...

Найти элементы одного массива в другом
Привет! Задача у меня была такова: для каждого из чисел второго массива вывести в отдельную строку "YES", если это число...

7
81 / 81 / 50
Регистрация: 26.11.2012
Сообщений: 303
11.10.2015, 17:34
PHP
1
2
3
4
5
6
7
8
$arr1 = array("apple", "orange", "orange", "apple", "lime", "apple");
$arr2 = array("apple", "lime", "lime", "apple", "tomato", "tomato");
 
for($i = 0; $i<count($arr1); $i++)
    for($j = 0; $j<count($arr2); $j++)
        if($arr1[$i] == $arr2[$j])
        //Тут делаем корректировку
            echo $i. " Элемент массива arr1 совпал с ".$j." Элементом массива arr2<br>";
1
0 / 0 / 0
Регистрация: 14.09.2014
Сообщений: 10
15.10.2015, 10:47  [ТС]
Попробовал выполнить через цикл while, но не получилось. Скорее всего я что то делаю не так,(я только изучаю php) посмотрите пожалуйста.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
header('Content-Type: text/html; charset=utf-8');//меняем кодировку
ini_set("max_execution_time", 600);//время исполнения 10 мин
// создание подключения к БД нового сайта
$dbHost_new='...';
$dbName_new='...';
$dbUser_new='...';
$dbPass_new='...';
$myConnect_new = mysql_connect($dbHost_new,$dbUser_new,$dbPass_new); 
mysql_select_db($dbName_new,$myConnect_new);
    if(!$myConnect_new)
    {
        throw new Exception('Не удалось подключиться к базе данных! Проверьте параметры подключения');
    }else{
        echo "<h2>База удачно подключена!</h2>";
    }
    if(!mysql_select_db($dbName_new,$myConnect_new)) // выбор бд
    {
        throw new Exception("Не удалось выбрать базу данных {$dbName_new}!");
    }else{
        echo "<h2>База {$dbName_new} удачно выбрана!</h2>";
    }
      mysql_set_charset("utf8");
 
// создание подключения к БД старого сайта
$dbHost_old='...';
$dbName_old='...';
$dbUser_old='...';
$dbPass_old='...';
$myConnect_old = mysql_connect($dbHost_old,$dbUser_old,$dbPass_old); 
mysql_select_db($dbName_old,$myConnect_old);
    if(!$myConnect_old)
    {
        throw new Exception('Не удалось подключиться к базе данных! Проверьте параметры подключения');
    }else{
        echo "<h2>База удачно подключена!</h2>";
    }
    if(!mysql_select_db($dbName_old,$myConnect_old)) // выбор бд
    {
        throw new Exception("Не удалось выбрать базу данных {$dbName_old}!");
    }else{
        echo "<h2>База {$dbName_old} удачно выбрана!</h2>";
    }
      mysql_set_charset("utf8");
// ========подключение к базе данных осуществленно!==================================
 
$count_statey = mysql_query("SELECT publish_up FROM gwert_content",$myConnect_old);
 
$count_statey = mysql_num_rows($count_statey); //подсчет количества строк в базе
print_r($count_statey);
$result = mysql_query("SELECT id,date,alt_name,title FROM dle_post",$myConnect_new);
$result_old = mysql_query("SELECT id,title,publish_up,alias FROM gwert_content",$myConnect_old); 
 
 
$n=0;
$m=0;
while($row[] = mysql_fetch_array($result));
    {
 
     $row[$n]["date"] = substr($row[$n]["date"], 0, 10);
    
        
    while ($row_old[$m][] = mysql_fetch_array($result_old)) {
    $row_old[$m]["publish_up"] = substr($row_old[$m]["publish_up"], 0, 10);//обрезаем время, оставляем только дату
    if($row[$n]["date"] == $row_old[$m]["publish_up"]){
       echo " Элемент массива ";
       echo($row[$n]["date"]);
       echo "совпал с элементом массива";
       print_r($row_old[$m]["publish_up"]);
       }
    $m++;
    }
 
    $n++;   
 
    }
    print_r($row);
    
?>
0
 Аватар для Laroux
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
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
15.10.2015, 11:30
1. сделайте уникальный ключ в целевой таблице по тем колонкам, которые его составляют.
2. экспортируйте старую таблицу в sql файл, замените названия полей на новые (в любом редакторе простой заменой)
3. залейте этот файл в новую таблицу.
это чтобы просто избавиться от дупликатов.
Если нужно обработать сами поля как-то, и записей действительно довольно много, то изучайте всякие разные функции mysql-я, егошный sql вообщем-то составляет тьюринг-полный язык, так что можно и на нем обработать как угодно. Для этого в конце каждого запроса (тоже делается простой заменой символа окончания строки или что-нибудь в этом роде) приписываете
SQL
1
ON DUPLUCATE KEY UPDATE <бла-бла-бла>
Если же строк в таблицах несколько тысяч (ну то есть не десятки и не сотни, тем более), то можно попробовать это и на пхп сделать: создаете некий хеш по столбцам, которые вы хотели проверить на совпадение

Не по теме:

простая конкатенация этих полей и занесение в ассоциаивный массив как ключей. значениями может быть что угодно. Проверка на то, есть или нет такая запись, делается вызовом оператора isset().


Итоговая сложность O(m+n) (количество записей в одной таблице+количество в другой, поиск по хеш-таблице амортизированно константен), что в итоге вам даст возможность обработать довольно приличное количество записей за достаточно небольшое время.
примерный "псевдокод" того, о чем я:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$records = array();
while ($row = mysql_fetch_array($result_new_table)) {
  $unique_key = $row['publish_up'] . "\x00" . $row['title'] . "\x00" . $row['author']; // опять же, как пример полей,
    // составляющих уникальный индекс. разумеется, лучше их разделять каким-нибудь непечатаемым символом, 
    // чтобы не возникло побочных совпадений
  $records[$unique_key] = 1;
}
 
while ($row = mysql_fetch_array($result_old_table)) {
  $unique_key = $row['old_publish_up'] . "\x00" . $row['old_title'] . "\x00" . $row['author'];
  if (isset($records[$unique_key])) {
    // есть совпадение
  } else {
    // совпадений нет
  }
}
замечу также, что во втором цикле (пока читаете старую таблицу) непосредственно вставлять записи не рекомендуется. Это, конечно, зависит от драйвера, mysql-ного движка для новой таблицы и разных настроек, но есть вариант, что это приведет к излишним блокировкам, или просто после вставки вы будете пробегаться по "нововставленным" записям еще разок, в конце. Поэтому лучше сложите сначала все данные для вставки в массив, а после окончания этого цикла чтения уже вставляйте, причем, желательно, в одной транзацкии -- так будет просто быстрее
1
0 / 0 / 0
Регистрация: 14.09.2014
Сообщений: 10
15.10.2015, 12:13  [ТС]
Подскажите, а мой вариант кода как то можно в чувства привести? Или он кардинально не верен?
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
15.10.2015, 13:31
сложно сказать, кардинально или нет, но так или иначе в вашем коде есть неудачные решения, из-за которых, по крайней мере потенциально, это дело может не работать.
первое, и пожалуй, самое главное, что я вижу, вы в цикле пытаетесь сделать еще один цикл по таблице. в mysql есть, конечно, кеш и все такое, но итерация по всем записям -- это по-хорошему, обращение к диску, и это долго. и так каждый раз, при чтении одной записи из новой таблицы, вы, видимо, хотели, проходиться по старой. Это долго и вы это делаете неправильно.
Второе. Чтобы сделать это правильно, вам на каждой итерации нужно очищать массив $row_old, и делать запрос
PHP
1
$old_result = mysql_query(...)
заново. Иначе у вас просто итератор этот застрянет в конце, и дальше вам будут добавляться в массив false, false, false, и во внутренний цикл оно ни разу не зайдет (ну потому что результат под while будет false).
Третье. Так действительно можно делать, и иногда это является хорошим решением, когда скорость вам неважна и вы очень сильно ограничены по памяти, что не можете себе позволить считать всю таблицу в массив. Пару тысяч записей, скорее всего, без проблем в нее влезут (хотя, конечно, зависит от размера еще и самих записей). Даже если вам и покажет ошибку, не унывайте, сначала увеличьте объем доступной памяти для скрипта, например:
PHP
1
ini_set("memory_limit","256M");
или даже под гиг можно выделить -- это все быстро отработает, если последуете тому алгоритму, который я описал в предыдущем посте.
В-четвертых, не забывайте, что в вашем случае, помимо лишних обращений к диску, вам на каждую запись из одной таблицы придется просматривать все записи из другой. Это сложность 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.10.2015, 13:31
Помогаю со студенческими работами здесь

Как найти все значения одного массива в другом многомерном массиве?
Доброго времени суток! Вообще задача сначала стояла так, но перемучившись решил сложить это бремя на PHP. Итак... имею на выходе массив...

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

Как проверить наличие одного элемента в другом?
Необходимо перебрать все элементы массива liMenu и, в случае, если элемент массива содержит картинку(img), присвоить ему высоту 40px, в...

Поиск элементов одного массива в другом
Есть 2 массива. Элементы почти все совпадают. Вот я хочу узнать все совпадения, а точнее их индексы. Например name {a,b,c,d,e}, а name2...

Определить наличие элементов одного массива в другом
Пишу в C Builder в консольном режиме. Задача такова: Задан одномерный массив В длины К. Опpеделить, какие элементы массива В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru