За последние 24 часа нас посетили 22272 программиста и 1053 робота. Сейчас ищут 587 программистов ...

Поиск в JSON (было: Сравнение масcивов)

Тема в разделе "MySQL", создана пользователем ghostcom, 2 апр 2019.

  1. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    Привет, как быстро сравнить два массива и найти значение.

    Массив первый - выбранные пользователем некие атрибуты:
    Код (Text):
    1. $arr1 = Array
    2. (
    3.     [attr_2_size] => Array
    4.         (
    5.             [group] => size
    6.             [grouptitle] => Size
    7.             [value] => 4
    8.         )
    9.  
    10.     [attr_2_color] => Array
    11.         (
    12.             [group] => color
    13.             [grouptitle] => Цвет
    14.             [value] => 7
    15.         )
    16. )
    Массив второй - аттрибуты на сервере:
    Код (Text):
    1. $arr2  => Array
    2.         (
    3.             [dependent0] => Array
    4.                 (
    5.                     [id] => 1554009142201
    6.                     [sku] => R5-BNT5656-O-XXL
    7.                     [prop] => Array
    8.                         (
    9.                             [color] => 8
    10.                             [size] => 4
    11.                         )
    12.                 )
    13.  
    14.             [dependent1] => Array
    15.                 (
    16.                     [id] => 1554009142202
    17.                     [sku] => R5-BNT5656-G-XXL
    18.                     [prop] => Array
    19.                         (
    20.                             [color] => 7
    21.                             [size] => 4
    22.                         )
    23.                 )
    24.  
    25.         )
    ЗАДАЧА: Найти ID во втором массиве где color==7 && size==4
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    а откуда появляется $arr2 ?
    выборка из БД? если так, то лучше сразу при выборке и искать то что нужно..
     
  3. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    В базе так и есть только в JSON.
     
  4. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @ghostcom, MySQL умеет работать с JSON
     
  5. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    и как вы себе это представляете, можно пример.
    Насколько я знаю выборку можно только по ключу делать.
    получается куча запросов пока не вернет true, т.е ID ???
    --- Добавлено ---
    Код (Text):
    1. foreach($arr1 as $key1 => $val1)
    2.         {
    3.             if (strpos($key1, 'prop_2') === 0)
    4.             {
    5.                 foreach($val1 as $key2 => $val2)
    6.                 {
    7.                     foreach($arr2 as $keyArr2 => $valArr2)
    8.                     {
    9.                         if ( $valArr2['prop'][$val1['group']] && $valArr2['prop'][$val1['group']] == $val1['value'])
    10.                         {
    11.                             $ID = $valArr2['id'];
    12.                         }
    13.                     }
    14.                 }
    15.              
    16.             }
    17.         }

    Вот например я могу в каждой итерации сделать сравнение одного атрибута, а как дальше)))
    -
     
  6. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    гугл прекрасно себе это представляет https://habr.com/ru/post/348854/
     
  7. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    самое сложное в вопросе - понять при чём здесь регулярка вообще?!1
    :)
    Screen Shot 2019-04-03 at 18.23.53.png

    для прохода по массиву из примера нах не надо вложенных циклов. один цикл и обращение к элементу типа
    $val1['id']
    $val1['prop']['color']
    и т.п.
    --- Добавлено ---
    но конечно это задача для sql, а не для вкачивания всего ассортимента в php и эпического перебора
    --- Добавлено ---
    автор, перепиши вопрос так, чтобы он был про запрос к базе. покажи в нём структуру (create table), а ещё лучше создай песочницу с данными на sqlfiddle или db-fiddle.
     
  8. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    По ошибке. Куча вкладок было открыто.
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
  10. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
  11. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    а если включить мозг? :)
     
  12. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    array_uintersect()
     
    ghostcom нравится это.
  13. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    То прекрасно работает с text, и еслиб в int можно было сохранять json то скорее всего тоже бы работало, а так хз.
    Представьте что я например профессор исторических наук. Ко мне подходит чувак и спрашивает дату смерти кого то там, а я ему говорю "ну ты мозг включи!"
    --- Добавлено ---
    Да пробовал наверно так и буду делать, спасибо!
     
  14. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    Тема перехала.
    Песочница с синтаксической ошибкой не песочница. Увы!

    Также чуйка мне подсказывает, что id надо искать в разных записях таблицы, а в примере на sqlfiddle одна запись с json который содержит кучу вложенного сего-то-там со своими id.
    Это точно то что надо? Мы что должны вернуть в итоге, айди из недр json или айди (первичный ключ) записи таблицы?
     
  15. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    Спасибо. Но я задавал вполне корректный вопрос "Сравнение массивов", ошибка с темой. Но не база данных!

    sqlfiddle на MySQL 5.6 и походу не дружит JSON

    Это точно то что нужно! И нужно найти ID из недр где например color==7 и size==4 (пост #1)
     
  16. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    мы же выяснили, что (1) данные из базы и (2) тебе дали годный совет, что можно искать сразу в базе. поэтому тема переехала. извини, если что. можешь поступить так: выложить код на пхп в котором есть нужный json чтобы люди могли с этим работать. это и будет песочница. короче, делай так чтобы отвечающим было удобно тебе помогать. Capische?

    да, походу sqlfiddle не поддерживает mysql 5.7+ которая нужна для json. зато https://www.db-fiddle.com/ норм. можно было там разместиться.

    ну если надо найти id из недр, то я валю из этой темы ))) стало неинтересно
     
  17. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    Сделал но не могу поделиться, походу регатся надо(
     
  18. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    [offtopic]РСУБД вроде MySQL предназначены для хранения структурированных данных, а не как свалка для текста. данные обычно нормализованы и имеют понятные связи. со структурироваными данными можно эффективно работать без грязных хаков.

    если мы вынуждены выкачивать все данные на сторону php чтобы найти что-то там, это признак плохого планирования изначально.[/offtopic]
    --- Добавлено ---
    не надо там регистрироваться, достаточно сделать save и тогда в адресной строке появляется нужная ссылка
     
    Valick нравится это.
  19. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
  20. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    комментарии в mysql выглядят как
    Код (Text):
    1. -- это не будет выполняться
    --- Добавлено ---
    буквально в таком виде данные неудобны для обработки в mysql. упрощенно говоря, select-where ищет записи, а не текст внутри поля.
    всё, я ушол из темы.
     
    ghostcom нравится это.
  21. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    Спасибо!!!
    --- Добавлено ---
    https://www.db-fiddle.com/f/3fj6zkMPEVmBwx48XbuRY2/2
     
  22. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @ghostcom, я понятия не имею зачем профессор исторических наук лезет в программирование, но то что надо поменять тип поля, для того что бы нормально работать с json на уровне СУРБД понятно даже ежу, тут и к бабке не ходи. Сдаётся мне вы очередной фрилансер которому по-быстрому надо слепить костыль, срубить бабла, а дальше хоть трава не расти. В противном случае вы бы искали грамотное решение и работали с данными на уровне БД для чего собственно она и была придумана.
     
  23. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    Лукавить не буду. Срубить бабла это хорошо. Автоваз слепили костыль и до сих пор рубят бабло.

    С базой у меня все в порядке. Просто есть одна колонка с динамическими свойствами и их может быть и 100 и 200. Для каждой записи они разные и ключи и значения.
    --- Добавлено ---
    В прочем как и всегда 90% оффтопа,
     
  24. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    В общем конкретно моя задача не решается с помощью одного SQL в любом случае сравнение массива

    т.к пока не возможно создать запрос такого вида

    WHERE column->"$.path" = $someValue;

    Возможно только

    WHERE column->"$.path" IS NOT NULL;

    что для меня бесполезно!

    Всем спасибо! Тему с БД можно закрыть!!!
     
  25. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Хорошо когда с базой всё в порядке, ещё лучше когда всё хорошо с головой. Поддержку JSON в БД как раз и добавили для динамических свойств. По ссылке которую я добавил как раз об этом и написано, если не ошибаюсь. Я давно по ней не ходил. Спасибо за внимание и "дозвиданья", как любил говаривать Василий Стрельников.