Я пытаюсь получить результат запроса, создать ассоциативный массив, где я использую высокий уровень для общего раскрывающегося списка, и этот раскрывающийся список загрузит соответствующие дочерние элементы массива.
Моя текущая функция:
$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) из выбранное место. Мне также понадобится идентификатор из отображения, чтобы сохранить его в базе данных, поэтому я думаю, что, как только я исправлю эту проблему, я просто смогу включить его позже в форму.
Что я делаю не так с массивом?






Вы можете перестроить свой массив следующим образом:
$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;?>
Вещи не повторятся. Кроме того, теперь вы можете легко создавать другие раскрывающиеся списки.
$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);
Итак, я попробовал это, и похоже, что в моем первом раскрывающемся списке теперь только правильное количество записей, но все они равны нулю.