Привет, как быстро сравнить два массива и найти значение. Массив первый - выбранные пользователем некие атрибуты: Код (Text): $arr1 = Array ( [attr_2_size] => Array ( [group] => size [grouptitle] => Size [value] => 4 ) [attr_2_color] => Array ( [group] => color [grouptitle] => Цвет [value] => 7 ) ) Массив второй - аттрибуты на сервере: Код (Text): $arr2 => Array ( [dependent0] => Array ( [id] => 1554009142201 [sku] => R5-BNT5656-O-XXL [prop] => Array ( [color] => 8 [size] => 4 ) ) [dependent1] => Array ( [id] => 1554009142202 [sku] => R5-BNT5656-G-XXL [prop] => Array ( [color] => 7 [size] => 4 ) ) ) ЗАДАЧА: Найти ID во втором массиве где color==7 && size==4
а откуда появляется $arr2 ? выборка из БД? если так, то лучше сразу при выборке и искать то что нужно..
и как вы себе это представляете, можно пример. Насколько я знаю выборку можно только по ключу делать. получается куча запросов пока не вернет true, т.е ID ??? --- Добавлено --- Код (Text): foreach($arr1 as $key1 => $val1) { if (strpos($key1, 'prop_2') === 0) { foreach($val1 as $key2 => $val2) { foreach($arr2 as $keyArr2 => $valArr2) { if ( $valArr2['prop'][$val1['group']] && $valArr2['prop'][$val1['group']] == $val1['value']) { $ID = $valArr2['id']; } } } } } Вот например я могу в каждой итерации сделать сравнение одного атрибута, а как дальше))) -
самое сложное в вопросе - понять при чём здесь регулярка вообще?!1 для прохода по массиву из примера нах не надо вложенных циклов. один цикл и обращение к элементу типа $val1['id'] $val1['prop']['color'] и т.п. --- Добавлено --- но конечно это задача для sql, а не для вкачивания всего ассортимента в php и эпического перебора --- Добавлено --- автор, перепиши вопрос так, чтобы он был про запрос к базе. покажи в нём структуру (create table), а ещё лучше создай песочницу с данными на sqlfiddle или db-fiddle.
поиск в json в mysql https://stackoverflow.com/a/39163928/272885 --- Добавлено --- подразумевается, что это mysql 5.7+ и тип поля json --- Добавлено --- учебник: https://www.sitepoint.com/use-json-data-fields-mysql-databases/
То прекрасно работает с text, и еслиб в int можно было сохранять json то скорее всего тоже бы работало, а так хз. Представьте что я например профессор исторических наук. Ко мне подходит чувак и спрашивает дату смерти кого то там, а я ему говорю "ну ты мозг включи!" --- Добавлено --- Да пробовал наверно так и буду делать, спасибо!
Тема перехала. Песочница с синтаксической ошибкой не песочница. Увы! Также чуйка мне подсказывает, что id надо искать в разных записях таблицы, а в примере на sqlfiddle одна запись с json который содержит кучу вложенного сего-то-там со своими id. Это точно то что надо? Мы что должны вернуть в итоге, айди из недр json или айди (первичный ключ) записи таблицы?
Спасибо. Но я задавал вполне корректный вопрос "Сравнение массивов", ошибка с темой. Но не база данных! sqlfiddle на MySQL 5.6 и походу не дружит JSON Это точно то что нужно! И нужно найти ID из недр где например color==7 и size==4 (пост #1)
мы же выяснили, что (1) данные из базы и (2) тебе дали годный совет, что можно искать сразу в базе. поэтому тема переехала. извини, если что. можешь поступить так: выложить код на пхп в котором есть нужный json чтобы люди могли с этим работать. это и будет песочница. короче, делай так чтобы отвечающим было удобно тебе помогать. Capische? да, походу sqlfiddle не поддерживает mysql 5.7+ которая нужна для json. зато https://www.db-fiddle.com/ норм. можно было там разместиться. ну если надо найти id из недр, то я валю из этой темы ))) стало неинтересно
[offtopic]РСУБД вроде MySQL предназначены для хранения структурированных данных, а не как свалка для текста. данные обычно нормализованы и имеют понятные связи. со структурироваными данными можно эффективно работать без грязных хаков. если мы вынуждены выкачивать все данные на сторону php чтобы найти что-то там, это признак плохого планирования изначально.[/offtopic] --- Добавлено --- не надо там регистрироваться, достаточно сделать save и тогда в адресной строке появляется нужная ссылка
комментарии в mysql выглядят как Код (Text): -- это не будет выполняться --- Добавлено --- буквально в таком виде данные неудобны для обработки в mysql. упрощенно говоря, select-where ищет записи, а не текст внутри поля. всё, я ушол из темы.
@ghostcom, я понятия не имею зачем профессор исторических наук лезет в программирование, но то что надо поменять тип поля, для того что бы нормально работать с json на уровне СУРБД понятно даже ежу, тут и к бабке не ходи. Сдаётся мне вы очередной фрилансер которому по-быстрому надо слепить костыль, срубить бабла, а дальше хоть трава не расти. В противном случае вы бы искали грамотное решение и работали с данными на уровне БД для чего собственно она и была придумана.
Лукавить не буду. Срубить бабла это хорошо. Автоваз слепили костыль и до сих пор рубят бабло. С базой у меня все в порядке. Просто есть одна колонка с динамическими свойствами и их может быть и 100 и 200. Для каждой записи они разные и ключи и значения. --- Добавлено --- В прочем как и всегда 90% оффтопа,
В общем конкретно моя задача не решается с помощью одного SQL в любом случае сравнение массива т.к пока не возможно создать запрос такого вида WHERE column->"$.path" = $someValue; Возможно только WHERE column->"$.path" IS NOT NULL; что для меня бесполезно! Всем спасибо! Тему с БД можно закрыть!!!
Хорошо когда с базой всё в порядке, ещё лучше когда всё хорошо с головой. Поддержку JSON в БД как раз и добавили для динамических свойств. По ссылке которую я добавил как раз об этом и написано, если не ошибаюсь. Я давно по ней не ходил. Спасибо за внимание и "дозвиданья", как любил говаривать Василий Стрельников.