За последние 24 часа нас посетили 32599 программистов и 1756 роботов. Сейчас ищут 911 программистов ...

Поиск совпадений в 2 массивах

Тема в разделе "Прочие вопросы по PHP", создана пользователем phpfan, 12 фев 2015.

  1. phpfan

    phpfan Новичок

    С нами с:
    30 янв 2015
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    Луганск
    Доброго времени суток уважаемые форумчане.
    Вот уже 2-ой день никак не могу одолесть такую задачу.
    Есть у меня массив из слов, пользователь вводит в текстовое поле через перенос, я его разбиваю на массив
    Код (Text):
    1. $name = split("\n", trim($name)); // Разбиваем на массив
    Получаю массив.
    А теперь самый главный вопрос, как теперь избежать попадания двойников в базу данных.
    Массив записываю в бд и там уже есть данные.
    Пробовал вот так
    Код (Text):
    1. function dubleString($cat, $name){
    2.   foreach($name as $item){
    3. $res[$item] = mysql_num_rows(mysql_query("select * from ".TABLE." where root_category='$cat' AND name_cat='$item'"));
    4. if($res[$item]>0)
    5.       return true;
    6.   }
    7.  return false;
    8. }
    где $name - массив из текстового поля (textarea)
    где переменная $cat - это номер категории, нужно сравнить 2 значения как в запросе, на соответствие если есть с номером такой категории и с таким именем то просто игнорировать его или дать предупреждение.

    Этот запрос проверяет только последнюю строку, а все остальные игнорирует.
    Что деелаю не так? Ткните пожалуйста.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    дык ретурнить надо массив с результатами же
     
  3. phpfan

    phpfan Новичок

    С нами с:
    30 янв 2015
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    Луганск
    Не помогает пробовал только последнее значение прооверяет в массиве name и все.

    Добавлено спустя 4 минуты 21 секунду:
    К примеру вот имеем массив name
    Код (Text):
    1. Array ( [0] => один [1] => два [2] => три )
    При первом добавлении все нормально
    При втором изменил только (три1) - проверяет.
    Меняю значение 2 или 1 - добавляет пока не изменишь последнее.
     
  4. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    Текст через " спуск строки " приходит из " textarea " и ты хочешь преобразовать это в массив и каждый элемент проверить в базе данных по так называемой категории - равно ли это тому что в базе есть и то, что есть покажет?
     
  5. phpfan

    phpfan Новичок

    С нами с:
    30 янв 2015
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    Луганск
    В массив преобразую
    Код (Text):
    1. $name = split("\n", trim($name)); // Разбиваем на массив
    И из базы массив, категория также есть в пост запросе но категория одно число для всех сравнений.
    Нужно проверить есть ли совпадение в базе данных по параметру
    К примеру я ввожу в textarea строки
    оди
    два
    три
    Получаю через сплит массив
    Код (Text):
    1. Array ( [0] => один [1] => два [2] => три )
    Как проверить все на совпадения? И выдать булев результат хотя бы.
     
  6. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    Код (PHP):
    1. function dubleString($cat,array $array) {
    2.     $cat=intval($cat);
    3.     if($cat && $array) {
    4.         $result=array();
    5.         foreach($array as $item) {
    6.             $item=mysql_real_escape_string($item);
    7.             if(empty($result[$item])) {
    8.                 $query=mysql_query("
    9.                     SELECT `name_cat` 
    10.                     FROM `".TABLE."` 
    11.                     WHERE `root_category`='".$cat."' 
    12.                     AND `name_cat`='".$item."' 
    13.                     LIMIT 0,1
    14.                 ") || exit(mysql_error());
    15.                 if($query) {
    16.                     $result[$item]=mysql_num_rows($query);
    17.                 }
    18.             }
    19.         }
    20.     return $result;
    21.     }
    22. return array();
    23. } 
    Ты хочешь результат в виде массива выполненых?
    Или ты хочешь видеть результат не выполненых? Дублей
     
  7. phpfan

    phpfan Новичок

    С нами с:
    30 янв 2015
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    Луганск
    Ругается на строку
    Код (Text):
    1.  
    2.  $result[]=mysql_num_rows($item);
    Ошибка
    Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in Z:\home\test1.ru\www\addcat\function.php on line 37
    Что-то не так?
    Смотрите я вот в файле на который отправлен action проверяю вот так
    Код (Text):
    1. $duble = dubleString($s_cat, $name);
    2.     if($duble!=0){
    3.         exit("Есть совпадения!");
    4.     }
    Добавлено спустя 18 минут 46 секунд:
    Мне нужно вернуть 1 или 0 если совпадения есть 1 нет 0
     
  8. phpfan

    phpfan Новичок

    С нами с:
    30 янв 2015
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    Луганск
    Проблема решена самым простым способом, оказалось, что при прогоне в цикле к проверяемому значению из массива добавлялся пробел, по этому и пропускало предыдущие совпадения.
    Всем спасибо!
     
  9. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    Код (PHP):
    1. function dubleString($cat, array $array) {
    2.     $cat=intval($cat);
    3.     $return=array();
    4.     if($cat && $array) {
    5.         foreach($array as $item) {
    6.             $item=mysql_real_escape_string($item);
    7.             if(mysql_query("
    8.                 SELECT `name_cat` 
    9.                 FROM `".TABLE."` 
    10.                 WHERE `root_category`='".$cat."' 
    11.                 AND `name_cat`='".$item."' 
    12.                 LIMIT 0,1
    13.             ")) {
    14.                 $return['found'][]=$item;
    15.             } else {
    16.                 $return['notfound'][]=$item;
    17.             }
    18.         }
    19.     }
    20. return $return;
    21. } 
     
  10. phpfan

    phpfan Новичок

    С нами с:
    30 янв 2015
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    Луганск
    Извените больше не буду плодить темы.
    Попробовал возвращает всеравно весь массив
    ввожу
    один
    два
    три
    пять
    Уже есть
    один
    два
    три
    Возвращает
    $duble = dubleString($s_cat, $name);
    print_r($duble);
    Код (PHP):
    1. Array ( [found] => Array ( [0] => один [1] => два [2] => три [3] => пять ) ) 
    А нужно вернуть массив без совпадений то есть Array ( [0] => пять)
    Может я что-то не так делаю.
    Спасибо вам огромное за помощь. Это единственный форум где мне ответили нормально.

    Добавлено спустя 19 минут 50 секунд:
    В общем когда проверяю вот так
    print_r($duble['notfound']); то ничего не выводит
    А вот так print_r($duble['found']); то выводит все и те что есть в базе.

    Добавлено спустя 36 минут 58 секунд:
    Сделал вот так
    Код (PHP):
    1.  function dubleString($cat, array $array) {
    2.         $cat=intval($cat);
    3.         $return=array();
    4.         if($cat && $array) {
    5.             foreach($array as $item) {
    6.                 $item=mysql_real_escape_string($item);
    7.                 if(mysql_num_rows(mysql_query("
    8.                     SELECT `name_cat` 
    9.                     FROM `".TABLE."` 
    10.                     WHERE `root_category`='".$cat."' 
    11.                     AND `name_cat`='".$item."' 
    12.                     LIMIT 0,1
    13.                 "))>0) {
    14.                     $return['found'][]=$item;
    15.                 } else {
    16.                     $return['notfound'][]=$item;
    17.                 }
    18.             }
    19.         }
    20.     return $return;
    21.     } 
    22.  
    Все работает
    Огромное спасибо rognorog
     
  11. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    агась, забыл mysql_num_rows дописать.
    только можно не писать >0 - это можно убрать, так как в случае 0 - это типичный false. лож.
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    даю подсказку на миллион долларов:
    - сделай поле уникальным (если оно не первичный ключ, создай уникальный индекс). теперь ты застрахован от несчастного случая ;)
    - записывай новые значения без проверки. если писать значения отдельными запросами, то новые значения пройдут, а лишнее не запишется.

    можно также писать все значения в одном INSERT, но тогда надо использовать опцию IGNORE.
    Гуглить "MYSQL INSERT IGNORE"
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    блин, а оказывается, считать не нужно было ничего...
     
  14. phpfan

    phpfan Новичок

    С нами с:
    30 янв 2015
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    Луганск
    Все кто писал позже!
    Запись в базу идет относительно категории с номером. А если у меня к примеру есть запись зонтик под другой категорией? А запись идет только уникальных значений? Читайте вопрос!
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Тогда уникальный индекс надо объявить по комбинации (категория, название).
    Код (Text):
    1. ALTER TABLE `mytable` ADD UNIQUE INDEX (`root_category`, `name_cat`)
    P.S. Делать запрос В ЦИКЛЕ блин чтобы узнать какие имена нельзя вставлять это ебаный капец! Если тебя самого не корёжит от такого, то ты никогда не станешь программистом :)
     
    Septerrianin нравится это.
  16. nguseff31

    nguseff31 Новичок

    С нами с:
    12 фев 2015
    Сообщения:
    8
    Симпатии:
    0
    попробуйте такой запрос:
    Код (PHP):
    1. $implodes = array();
    2. foreach($name as $item) {
    3.   $implodes[] = "select $item as `name_cat`";
    4. }
    5. $sql1 = implode(' union ', $implodes);
    6. $sql2 = "SELECT `name_cat` 
    7.                     FROM `".TABLE."` 
    8.                     WHERE `root_category`='".$cat."'";
    9. $query = "select distinct vars.name_cat from ($sql1) as vars left join ($sql2) as t on t.name_cat = vars.name_cat where t.name_cat is null";
    10.  
    должен вывести строки, которых в базе нет.
     
  17. phpfan

    phpfan Новичок

    С нами с:
    30 янв 2015
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    Луганск
    artoodetoo Мне нужно получить массив совпавших и не совпавших. И не нужно здесь умничать на счет запросов в цикле. Mysql выдержывает нормально миллионы запрсов в секунду в чем проблема? Мы в 21 веке живем, что же вы все паритесь на счет нагрузок на сервер баз данных, забудьте уже наконец про них!
    Мне этот запрос нужен на локальной машине а не на сайте. Расслабтесь попейте пива отдохните!
     
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Да мне всё равно, тебе с этим жить.
     
    Septerrianin нравится это.