Создание многомерного массива с PHP и MySQL

Я новичок в PHP и ищу эффективные способы возврата данных из базы данных. Допустим, у меня есть таблица UserProfile, у которой есть отношения друг к другу с UserInterest и UserContact:

Select p.Id, p.FirstName, p.LastName, i.Name as Interests, c.Email, c.Phone from UserProfile p left join UserInterest i on p.Id = i.UserProfileId left join UserContact c on p.Id = c.UserProfileId where p.Id = 1 

Эффективным способом получения данных было бы создание многомерного массива, такого как:

 $user = array( "FirstName" => "John", "LastName" => "Doe", "Gender" => "Male", "Interests" => array( "Hiking", "Cooking"), "Contact" => array( "Email" => "john.doe@gmail.com", "Phone" => "(555) 555-5555")); 

Я не могу понять, как это будет построено на PHP. Для простых данных, подобных интересам, я мог бы использовать group_concat (i.Name) как интересы в запросе, чтобы возвращать интересы обратно в виде списка, разделенного запятыми, в одной строке, однако для ассоциативного массива, такого как Contact, я хотел бы иметь возможность чтобы получить дескриптор каждого ключа в массиве, используя $ user ['Contact'] ['Email'].

С точки зрения «наилучшей практики» я бы предположил, что построение такого массива в одном запросе намного лучше, чем удача базы данных несколько раз для извлечения этих данных.

Благодаря!

Нил

Вы можете построить этот массив за один проход через данные, возвращаемые вашим запросом. В псевдокоде:

 for each row $user["FirstName"] = row->FirstName; $user["LastName"] = row->LastName; $user["Interests"][] = row->Interests; $user["Contact"]["Email"] = row->Email; $user["Contact"]["Phone"] = row->Phone; next 

Синтаксис $user["Interests"][] = $data действителен PHP-код. Это эквивалентно array_push($user["Interests"], $data) .

Я предполагаю, что вам придется запускать отдельные запросы и вручную строить массив самостоятельно. Я лично не знаю каких-либо ресурсов базы данных MySQL в PHP, которые возвращают подобные строки в многомерном массиве так, как вы описали.

Лучшим способом сделать это может быть:

 $query = "SELECT p.Id, p.FirstName, p.LastName, i.Name as Interests, c.Email, c.Phone FROM UserProfile p LEFT JOIN UserInterest i ON p.Id = i.UserProfileId LEFT JOIN UserContact c ON p.Id = c.UserProfileId WHERE p.Id = 1"; $res = GIDb::pg_query($query); if(pg_num_rows($res) > 0) { while($data = pg_fetch_assoc($res)) { $id = $data['Id']; $f_name = $data['FirstName']; $l_name = $data['LastName']; $interests = $data['Interests']; $email = $data['Email']; $phone = $data['Phone']; } } //You can also directly use $data['Id'] etc. 

Также не забудьте включить в начало php-кода: include_once(dirname(__FILE__)."/../../class.GIDb.php");

РЕДАКТИРОВАТЬ :
Это для Postgres.
Для MySQL используйте: mysql_query(), mysql_fetch_assoc(), mysql_num_rows()