Я пробовал поиск в Google, но это не помогло. Вот моя проблема ...PHP - Разбор массива с несколькими родителями и объединение детей
У меня есть запрос, который я запускаю, чтобы извлекать данные из 4 или 5 таблиц. Он отлично работает, но если есть несколько дочерних элементов, родитель возвращается как часть массива с несколькими подмассивами. Я хочу проанализировать массив и получить соответствующие данные, но я не уверен, как лучше всего это сделать. Я знаю, что PHP имеет сильное подмножество предопределенных функций, которые обрабатывают массивы и MySQL, поэтому я не был уверен, что что-то мне не хватало. Кроме того, я использую PDO, если это имеет значение.
Вот мой пример. У меня есть следующие таблицы
Parent (точки) адрес (адреса) телефона (телефонов) Географические данные (геоданных)
Когда я вытягиваю данные должны быть только одна строка из каждой таблицы для телефонов, кроме , В списке может быть указано 2 или 3 телефона. Все отличные, кроме моего запроса, затем имеют родительские данные с соответствующими дочерними данными, перечисленными несколько раз для каждой телефонной линии. Когда я получаю массив, я думал о двух способах его решения ... но я не уверен.
1) Соедините массив и сравните текущий ключ с предыдущей клавишей. Если разные, закройте старый div, напечатайте новый. Если нет, добавьте новый дочерний элемент в существующий div. Это кажется излишним для такой простой задачи, и кажется немного примитивным, учитывая надежные функции, доступные для других вещей.
2) Я немного играл с array_map и array_unique. Благодаря сочетанию двух я могу получить уникальные ключи. Проблема здесь в том, что когда у меня есть уникальные значения, я не уверен, как захватить соответствующие дочерние элементы и правильно создать новый массив с дочерними элементами, сгруппированными под родителями.
Есть ли что-то, что мне не хватает? У меня нет PHP для публикации, но я собираюсь опубликовать свой запрос на случай, если есть что-то, что я могу сделать там, чтобы помочь. Кроме того, я не ищу, чтобы кто-нибудь дал мне код здесь - просто толчок в правильном направлении был бы замечательным.
Спасибо заранее!
SELECT 04_rest_00_locations.Name,
04_rest_00_locations.Description,
04_rest_00_locations.RNID,
04_rest_01_addresses.Add1,
04_rest_01_addresses.Add2,
02_driver_geodata.primary_city,
02_driver_geodata.state,
02_driver_geodata.zip,
04_rest_01_phones.AreaCode,
04_rest_01_phones.Prefix,
04_rest_01_phones.LineNum
FROM 04_rest_00_locations
LEFT JOIN 04_rest_01_addresses
ON 04_rest_00_locations.id = 04_rest_01_addresses.RestID
AND GroupID
IN (SELECT 04_rest_00_locations.GroupID
FROM 04_rest_00_locations
WHERE RestID = $RestID)
LEFT JOIN 04_rest_01_phones
ON 04_rest_00_locations.id = 04_rest_01_phones.RestID
AND 04_rest_01_phones.active = 1
AND 04_rest_01_phones.IsPublic = 1
AND 04_rest_01_phones.PhoneType = 1
LEFT JOIN 02_driver_geodata
ON 04_rest_01_addresses.CSZID = 02_driver_geodata.id
AND 04_rest_01_addresses.active = 1
AND 04_rest_01_addresses.AddType = 1
WHERE 04_rest_00_locations.active = 1
AND 04_rest_00_locations.Published = 1
Update - Я изменил мой запрос к следующему, он прекрасно работает (спасибо), но он возвращает только одну строку. Я что-то пропустил? Еще раз спасибо!!
SELECT 04_rest_00_locations.Name,
04_rest_00_locations.Description,
04_rest_00_locations.RNID,
04_rest_01_addresses.Add1,
04_rest_01_addresses.Add2,
02_driver_geodata.primary_city,
02_driver_geodata.state,
02_driver_geodata.zip,
GROUP_CONCAT(04_rest_01_phones.PhoneType, ";", 04_rest_01_phones.AreaCode, 04_rest_01_phones.Prefix, 04_rest_01_phones.LineNum) AS Phones
FROM 04_rest_00_locations
LEFT JOIN 04_rest_01_addresses
ON 04_rest_00_locations.id = 04_rest_01_addresses.RestID
AND GroupID
IN (SELECT 04_rest_00_locations.GroupID
FROM 04_rest_00_locations
WHERE RestID = 1)
LEFT JOIN 04_rest_01_phones
ON 04_rest_00_locations.id = 04_rest_01_phones.RestID
AND 04_rest_01_phones.active = 1
AND 04_rest_01_phones.IsPublic = 1
LEFT JOIN 02_driver_geodata
ON 04_rest_01_addresses.CSZID = 02_driver_geodata.id
AND 04_rest_01_addresses.active = 1
AND 04_rest_01_addresses.AddType = 1
WHERE 04_rest_00_locations.active = 1
AND 04_rest_00_locations.Published = 1
Вы должны сделать это в MySQL. Сгруппировав телефонные номера в одну строку. Это должно уточнить: http://stackoverflow.com/questions/276927/can-i-concatenate-multiple-mysql-rows-into-one-field – Mouser
Если бы я был вами, я бы рассмотрел вопрос об использовании псевдонима для имен ваших таблиц , этот запрос ОЧЕНЬ трудно читать. Кроме того, почему вы помещаете условия из другой таблицы в левое соединение? aka 'AND 04_rest_01_addresses.active = 1' –
тому, что говорил @Mouser. вы можете «GROUP_CONCAT()» номер телефона, а затем, если вы хотите, чтобы он находился в массиве на стороне php, вы можете просто «взорваться» (',', $ phoneNumberString); ' –