На сайте есть 2 синхронных select,
<select name="index" class="airports" id="index">
<?php foreach ($indexes as $k) :?>
<option><?=$k?></option>
<?php endforeach;?>
</select>
<select name="airport" class="airports" id="airname">
<?php foreach ($airports as $k) :?>
<option><?=$k?></option>
<?php endforeach;?>
</select>
соединённых скриптом
<script type="text/javascript">
$(function(){
airname.onchange=function(){Array.from(airname.options).map((v,i)=>{if(v.selected) index.value=Array.from(index.options)[i].value})}
index.onchange=function(){Array.from(index.options).map((v,i)=>{if(v.selected) airname.value=Array.from(airname.options)[i].value})}
});
</script>
Массивы $indexes и $airports берутся из БД, значения каждого элемента обоих массивов записано в своей строке , то есть
index | airport
-------------------
UHWW | Владивосток
URMG | Грозный
UIII | Иркутск
То есть порядок элементов правильный , и индексу соответствует правильный аэропорт. JS отрабатывает правильно.
Но мне нужно отсортировать индексы по алфавиту. Делаю я это с помощью функции natsort(), или же можно отсортировать прямо в запросе к БД. Но тогда порядок элементов сбивается, и выбирается не правильный option во втором select.
Как нужно переписать javascript чтобы это исправить???
Обратите внимание, что индекс и название это свойства аэропорта. Аэропорт это объект в терминах ООП. И рассматривать его свойства и их взаимодействие нет никакого смысла. Из базы следует выбирать $airports, состоящий из элементов с полями index и name (неудачное именование полей в бд возможно вас и сбивает).
А дальше всё просто: дважды обходите $airports чтобы собрать два селекта. При обходе используйте свойство value у option:
<select name="index" class="airports" id="index">
<?php foreach ($airports as $airport): ?>
<option value="<?= htmlspecialchars($airport['index']) ?>">
<?= htmlspecialchars($airport['index']) ?>
</option>
<?php endforeach ?>
</select>
<select name="airport" class="airports" id="airname">
<?php foreach ($airports as $airport): ?>
<option value="<?= htmlspecialchars($airport['index']) ?>">
<?= htmlspecialchars($airport['name']) ?>
</option>
<?php endforeach ?>
</select>
Обратите внимание, что и в первом и во втором списке значение одно и тоже! Ведь индекс однозначно указывает на аэропорт и два списка нужны только для удобства пользователя.
Теперь при изменении одного из селектов, выставляйте такое же значение во втором.
UPD:
Если для удобства пользователя селекты надо отстортировать по алфавиту, то сделайте это с помощью функции usort. Например так:
usort($airports, function($a, $b) {
return $a['index'] <=> $b['index'];
});
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости