arr1 Код (Text): array ( 'prop_2_size' => array ( 'group' => 'size', 'grouptitle' => 'Size', 'value' => '4', ), 'prop_2_color' => array ( 'group' => 'color', 'grouptitle' => 'Цвет', 'value' => '7', ), ) arr2 Код (Text): array ( 'dependent0' => array ( 'id' => '1554009142201', 'sku' => 'R5-BNT5656-O-XXL', 'prop' => array ( 'color' => '8', 'size' => '4', ), 'img' => '', 'act' => '=', 'price' => '200', 'quantity' => '6', ), 'dependent1' => array ( 'id' => '1554009142202', 'sku' => 'R5-BNT5656-G-XXL', 'prop' => array ( 'color' => '7', 'size' => '4', ), 'img' => '', 'act' => '=', 'price' => '200', 'quantity' => '4', ), 'dependent2' => array ( 'id' => '1554009142203', 'sku' => 'R5-BNT5656-B-S', 'prop' => array ( 'color' => '6', 'size' => '2', ), 'img' => '', 'act' => '=', 'price' => '200', 'quantity' => '13', ), ) --- Добавлено --- ЗАДАЧА: Найти ID во втором массиве где color==7 && size==4
В общем сделал так. Можно вставить в песочницу http://phpfiddle.org/ Спойлер: Код PHP: <?php $array1 = array ( 'prop_2_size' => array ( 'group' => 'size', 'grouptitle' => 'Size', 'value' => '4', ), 'prop_2_color' => array ( 'group' => 'color', 'grouptitle' => 'Цвет', 'value' => '8', ), ); $array2 = array ( 'dependent0' => array ( 'id' => '1554009142201', 'sku' => 'R5-BNT5656-O-XXL', 'prop' => array ( 'color' => '8', 'size' => '4', ), 'img' => '', 'act' => '=', 'price' => '200', 'quantity' => '6', ), 'dependent1' => array ( 'id' => '1554009142202', 'sku' => 'R5-BNT5656-G-XXL', 'prop' => array ( 'color' => '7', 'size' => '4', ), 'img' => '', 'act' => '=', 'price' => '200', 'quantity' => '4', ), 'dependent2' => array ( 'id' => '1554009142203', 'sku' => 'R5-BNT5656-B-S', 'prop' => array ( 'color' => '6', 'size' => '2', ), 'img' => '', 'act' => '=', 'price' => '200', 'quantity' => '13', ), ); $b = array(); // преобразовал массив к виду $array2['dependentX']['prop'] foreach($array1 as $key1 => $val1) { if (strpos($key1, 'prop_2') === 0) { $a = array($val1['group'] => $val1['value']); $b = array_merge( $a, $b); } } // перебрал $array2 и сравнил с $b foreach($array2 as $key2 => $val2) { if (empty(array_diff_assoc($val2['prop'], $b))) { $id = $val2['id']; break; } } echo 'id = ' . $id; ?> Всем спасибо!
@ghostcom И вам спасибо за интересный вопрос ) PHP: foreach($arr2 as $ar){ foreach ($ar as $k => $v){ if ($v === ['color'=>$arr1['prop_2_color']['value'], 'size'=>$arr1['prop_2_size']['value']]){ echo $ar['id']; } } }
запрос по двум параметрам из бд по полю JSON вернувший 10тыс записей с копейками из миллиона, занял полторы секунды причём поле не индексировано хотел бы я посмотреть как ты выгрузишь миллион записей в РНР и что-то там будешь искать
Так можно отсортировать: Код (Text): DELIMITER // CREATE PROCEDURE proc() BEGIN SET @p := 0; WHILE @p<3 DO SET @id := CONCAT('$[', @p,'].id'); SET @c := CONCAT('$[', @p,'].prop.color'); SET @s := CONCAT('$[', @p,'].prop.size'); SELECT JSON_EXTRACT(prop->'$.dependent.*',@id) id, JSON_EXTRACT(prop->'$.dependent.*',@c) color, JSON_EXTRACT(prop->'$.dependent.*',@s) size FROM `products`; SET @p:=@p+1; END WHILE; END // CALL proc()
Неужели? Тут и artoodetoo говорил что данные неудобны, так что не нужно из себя строить великого программиста.
из разряда - Если нельзя, но очень хочется PHP: SELECT JSON_UNQUOTE(JSON_EXTRACT(arr, CONCAT('$[', ind, '].id'))) id FROM ( SELECT prop->'$.dependent.*' AS arr FROM `products` WHERE id = 12 ) arrays JOIN ( /* этот кусок генерируешь сам, сколько надо, или джойнишь с вспомогательной таблицей */ SELECT 0 AS ind UNION SELECT 1 AS ind UNION SELECT 2 AS ind -- ... ) AS indexes WHERE 1 AND JSON_UNQUOTE(JSON_EXTRACT(arr, CONCAT('$[', ind, '].prop.size'))) = 4 AND JSON_UNQUOTE(JSON_EXTRACT(arr, CONCAT('$[', ind, '].prop.color'))) = 7 ; а вообще, лучше вынести это из JSON. тогда будет простой и быстрый запрос поиска. а не этот франкенштейн. либо юзаем MYSQL8, там есть JSON_TABLE()