Intereting Posts
FOSUserBundle Override Roles – свойства «роли» в «Acme \ DemoBundle \ Entity \ User» уже были объявлены, но должны быть объявлены только один раз Преобразование армейского времени в основное время AM PM в PHP Предупреждение Codeigniter PHP WooCommerce – отправить пользовательский адрес электронной почты с изменением статуса пользовательского заказа Статические переменные PHP на нескольких страницах .php Dropzone.js удалить кнопку с php Создание глобальной переменной, доступной для каждой функции внутри класса Могу ли я определить, был ли PNG-файл преобразован из многостраничного PDF-файла и разделить изображение на отдельные файлы с помощью ImageMagick? PHP: использование переменной внутри двойных кавычек laravel uuid не отображается в запросе Доктрина 2 + zf 1.11 загружать изображения и данные из mysql во Flash с помощью PHP? Сломанное изображение с файлами readfile и file_get_contents Определение границ предложения php Соединение MYSQL close не может остановить работу вставки

PHP / mySQL – как вставить вложенные строки в многомерную матрицу

Исходя из другого моего вопроса, в котором я узнал, что НИКОГДА не использую запросы db в циклах, я, следовательно, должен научиться извлекать все данные удобным образом, прежде чем я прохожу через него.

Предположим, у меня есть две таблицы «весы» и «предметы». Каждый элемент в единицах относится к одной шкале в масштабах и связан с внешним ключом (scaleID). Я хочу получить все эти данные в структуру массива в одном запросе, так что первое измерение – это все шкалы со всеми столбцами и вложенными внутри, все элементы одного масштаба всех столбцов.

Результат будет примерно таким:

scale 1, scaleParam1, scaleParam2, ... ....item1, itemParam1, itemParam2, ... ....item2, itemParam1, itemParam2, ... scale 2, scaleParam2, scaleParam2, ... ....item1, itemParam1, itemParam2, ... ....item2, itemParam1, itemParam2, ... 

До сих пор я делал в основном левые объединения для отношений «один к одному». Это один-ко-многим, и я просто не могу обдумать его.

Это правильное соединение, можно ли это сделать и с подзапросом, как получить в него все внешние внешние строки …

    позже я хотел бы перебирать его с помощью вложенных петлей foreach.

    Может быть, просто у меня болит голова …

    Related of "PHP / mySQL – как вставить вложенные строки в многомерную матрицу"

    Запрос должен выглядеть примерно так:

     SELECT * FROM scales INNER JOIN items ON scales.id = items.scale_id 

    Если вы хотите выполнить итерацию с помощью вложенных циклов, вам нужно будет вывести эти данные в массив – надеюсь, вы не отступите так сильно, что он съест слишком много памяти.

     $scales = array(); while ($row = mysql_fetch_assoc($data)) { if (!isset($scales[$row['scale_id']])) { $row['items'] = array(); $scales[$row['scale_id']] = $row; } $scales[$row['scale_id']]['items'][] = $row; } 

    Затем вы можете пройти через:

     foreach ($scales as $scale) { foreach ($scale['items'] as $item) ; //... do stuff } 

    Примечание: это несколько наивно в том, что $ scale и $ item будут содержать поля из BOTH-таблиц … Если это проблема, вам нужно изменить назначения в вышеприведенном цикле, чтобы вытащить только нужные вам поля.

    Возможно, было бы легче получить все весы, а затем все предметы.

     //first get scales while ($row = fetchrowfunctionhere()) { $scale = $scales->createFromArray($row); } //then get items $lastId = null; while ($row = fetchrowfunctionhere()) { $scaleId = $row['scaleID']; if ($lastId != $scaleId) { $scale = $scales->getByScaleId($scaleId); } $item = $items->createFromArray($row); $scale->addItem($item); $lastId = $scaleId; } 

    или все в одном sql

     $lastId = null; while ($row = fetchrowfunctionhere()) { $scaleData = array_slice($row, 0, 5, true); $itemData = array_slice($row, 5, 5, true); $scaleId = $scaleData['scaleID']; if ($lastId != $scaleId) { $scale = $scales->createFromArray($scaleData); } $item = $items->createFromArray($itemData); $scale->addItem($item); $lastId = $scaleId; } 

    все как один счастливый массив

     while ($row = fetchrowfunctionhere()) { $scaleData = array_slice($row, 0, 5, true); $itemData = array_slice($row, 5, 5, true); $scaleId = $scaleData['scaleID']; if (!isset($scales[$scaleId])) { $scales[$scaleId] = $scaleData; } $itemId = $itemData['itemID']; $scales[$scaleId]['items'][$itemId] = $itemData; }