Восстановление массива для динамических раскрывающихся списков

Я пытаюсь получить результат запроса, создать ассоциативный массив, где я использую высокий уровень для общего раскрывающегося списка, и этот раскрывающийся список загрузит соответствующие дочерние элементы массива.

Моя текущая функция:

$getDisplays = "
SELECT *
FROM locations l
inner join displays d
ON d.location_id = l.id;";

$displayResult = $mysqlConn->query($getDisplays);

Это возвращает:

Array
(
[ID] => 1
[location_name] => Office 1
[display_name] => lobby
[location_id] => 1
)
Array
(
[ID] => 2
[location_name] => Office 1
[display_name] => break room
[location_id] => 1
)
Array
(
[ID] => 3
[location_name] => Office 2
[display_name] => lobby
[location_id] => 2
)
Array
(
[ID] => 4
[location_name] => Office 2
[display_name] => break room
[location_id] => 2
)
Array
(
[ID] => 10
[location_name] => Office 5
[display_name] => Break Room
[location_id] => 5
)
Array
(
[ID] => 11
[location_name] => Office 5
[display_name] => Lobby
[location_id] => 5
)
Array
(
[ID] => 12
[location_name] => Office 5
[display_name] => Conference Room
[location_id] => 5
)

Я пытаюсь создать динамические раскрывающиеся списки, чтобы в первом отображалось каждое отдельное location_name, а в зависимости от выбора второй раскрывающийся список содержал соответствующее display_name.

Итак, для этого массива в первом раскрывающемся списке будут:

<option>Office 1</option>
<option>Office 2</option>
<option>Office 5</option>

и если я выберу Office 1, следующее раскрывающееся меню будет содержать:

<option>lobby</option>
<option>break room</option>

То, как я их строю сейчас:

<label for = "plantSelect">Select A Location</label>
<select class = "form-control" id = "plantSelect">
    <?php foreach($displayResult as $area=>$display):?>
    <option><?php echo $display['location_name']?></option>
    <?php endforeach;?>
</select>

<label for = "areaSelect">Select An Area</label>
<select class = "form-control" id = "areaSelect">

    <option>Please Choose a Location</option>

</select>

Проблема в том, что в первом раскрывающемся списке отображается каждая запись, поэтому отображается несколько экземпляров Office 1, Office 2 и Office 5. Я хочу, чтобы он отображал только одно имя каждого местоположения, а затем загружал следующий раскрывающийся список с дочерними элементами (display_name) из выбранное место. Мне также понадобится идентификатор из отображения, чтобы сохранить его в базе данных, поэтому я думаю, что, как только я исправлю эту проблему, я просто смогу включить его позже в форму.

Что я делаю не так с массивом?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
34
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете перестроить свой массив следующим образом:

$displayNames = array();
foreach($displayResult as $subArray) {
  if (!array_key_exists($subArray['location_name'], $displayNames)) {
    $displayNames[$subArray['location_name']] = array();

  }
    $displayNames[$subArray['location_name']][] = $subArray['display_name'];
}

Теперь вы можете сделать что-то вроде:

<?php foreach($displayNames as $displayName):?>
<option><?php echo key($displayName['location_name'])?></option>
<?php endforeach;?>

Вещи не повторятся. Кроме того, теперь вы можете легко создавать другие раскрывающиеся списки.

Итак, я попробовал это, и похоже, что в моем первом раскрывающемся списке теперь только правильное количество записей, но все они равны нулю.

Geoff_S 17.07.2018 20:38
$displayNames = array();
foreach($displayResult as $subArray) {
  if (!array_key_exists($subArray['location_name'], $displayNames)) {
      $displayNames[$subArray['location_id']]['location'] = $subArray['location_name'];
      $displayNames[$subArray['location_id']]['display_name'] = array();
  }

  array_push( $displayNames[$subArray['location_id']]['display_name'], array($subArray['ID'] => $subArray['display_name']));
}

print_r ($ displayNames);

Другие вопросы по теме