2014-12-22 3 views
0

Я пробовал поиск в 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 
+1

Вы должны сделать это в MySQL. Сгруппировав телефонные номера в одну строку. Это должно уточнить: http://stackoverflow.com/questions/276927/can-i-concatenate-multiple-mysql-rows-into-one-field – Mouser

+0

Если бы я был вами, я бы рассмотрел вопрос об использовании псевдонима для имен ваших таблиц , этот запрос ОЧЕНЬ трудно читать. Кроме того, почему вы помещаете условия из другой таблицы в левое соединение? aka 'AND 04_rest_01_addresses.active = 1' –

+3

тому, что говорил @Mouser. вы можете «GROUP_CONCAT()» номер телефона, а затем, если вы хотите, чтобы он находился в массиве на стороне php, вы можете просто «взорваться» (',', $ phoneNumberString); ' –

ответ

0

Извините! Глупо мне, я нашел свой ответ. Вот обновленный запрос - вам нужно объединить данные, чтобы они работали.

SELECT loc.Name, loc.Description, loc.RNID, addr.Add1, addr.Add2, geo.primary_city, geo.state, geo.zip, GROUP_CONCAT(ph.PhoneType, ";", ph.AreaCode, ph.Prefix, ph.LineNum) AS Phones 
FROM 04_rest_00_locations loc 
LEFT JOIN 04_rest_01_addresses addr 
    ON loc.id = addr.RestID 
    AND GroupID IN 
    ( SELECT loc.GroupID 
     FROM loc 
     WHERE RestID = 1 
    ) 
LEFT JOIN 04_rest_01_phones ph 
    ON loc.id = ph.RestID 
    AND ph.active = 1 
    AND ph.IsPublic = 1 
LEFT JOIN 02_driver_geodata geo 
    ON addr.CSZID = geo.id 
    AND addr.active = 1 
    AND addr.AddType = 1 
WHERE loc.active = 1 
AND loc.Published = 1 
GROUP BY loc.id 

Вот некоторые ссылки, которые я нашел, которые действительно помогли с этим. Еще раз спасибо за помощь ребятам!

GROUP_CONCAT explained, Grouping and why it's important :)

+0

wow, ... Я думал, что у вас было несколько телефонных номеров, а не номер телефона. Мой плохой. если бы были какие-то данные, я бы рекомендовал сразу же haha ​​good catch –

+0

Это было как несколько телефонных номеров, которые были разделены на части, но это сработало отлично, и я чему-то научился. Мне все еще интересно, что здесь может предложить PHP, но это отличное решение. еще раз спасибо – b3tac0d3

Смежные вопросы