Я бы предложил совершенно другой подход, который полностью избавит от проблемы хранения и сделает ваше приложение более эффективным. Хранение сериализованных массивов, полных информации, которую можно в любом случае извлечь из базы данных, является избыточным и крайне неэффективным. Наилучшим подходом здесь будет нормализация ваших данных.
Вам следует создать четвертую таблицу, возможно, с именем 'region_categories
', которая будет простой таблицей поиска:
CREATE TABLE region_categories (
regionId int unsigned not null,
categoryId int unsigned not null,
PRIMARY KEY(regionId,categoryId)
);
Теперь вместо того, чтобы сохранять все в массив, для каждого города / региона вы должны вместо этого заполнить эту таблицу категориями, которые находятся в этом городе. Размер ваших данных очень мал, так как все, что вы храните, это пара идентификаторов.
Когда приходит время извлекать категории для данного региона, вам просто нужно выполнить простое выражение SELECT
:
SELECT category.*
FROM region_categories AS rc LEFT JOIN categories AS c ON rc.categoryId=c.categoryId
WHERE rc.regionId=[whatever region you're dealing with]
Теперь вы можете перебирать результаты, и у вас будут все категории для этого региона.