Если я правильно понял вопрос, я бы поступил так:
Прервите зависимость от БД, в основном вы пытаетесь сделать слишком много с этим одним фрагментом кода.
Сначала создайте обобщенную функцию, подобную этой, для создания своего HTML. Эта функция должна принимать идентификатор поля и массив опций, которые содержат значение и содержимое тега опции.
Примерно так:
function createDataList($id, array $options){
$html = ['<datalist id="'.$id.'">'];
foreach($options as $value=>$content){ ?>
$html[] = '<option value="'.$value.'">'.$content.'</option>';
}
$html[] = '</datalist>';
return implode("\n", $options);
}
Тогда, когда вам нужно его использовать, вы можете передать массив следующим образом:
//the "value" should be unique so we can use that for the key,
//then the other is what I like to call the "content"
// [value=>content, value=>content]
$options= ['foo'=>'This is foo', ...];
echo createDataList('test', $options);
Ожидаемый результат:
<datalist id="test">
<option value="foo">This is foo</option>
...
</datalist>
Приятно то, что вы можете получить этот массив из любого места. Вы можете сделать это вручную, вы можете сделать это из БД. Например:
$options= [];
while($row = mysqli_fetch_array($resultEleven)){
$options[$row['stateValue']] = $row['stateName'];
}
echo createDataList('box2c2', $options);
А для второго:
$options= [];
while($row = mysqli_fetch_array($resultSeventeen)){
$options[$row['stateValue']] = $row['stateName'];
}
echo createDataList('box5c2', $options);
Итак, вы видите, что это дает вам гораздо большую гибкость и намного меньше дублирования.
Конечно, вам придется циклически перебирать данные 2x вместо 1x, но если вы не разберетесь с десятками тысяч строк, я сомневаюсь, что вы заметите это. К тому времени, когда вы заметите проблемы с производительностью, вы будете больше беспокоиться о количестве запросов.
Даже если у вас есть существующий массив с кучей «мусора» в нем.
$array = [['stateValue'=>'MI','stateName'=>'Michigan'], [...]];
Вы можете использовать это для быстрого форматирования.
$data = array_column($array, 'stateValue', 'stateName');
//result: ['MI' => 'Michigan', ...]
array_column ( array $ input , mixed $ column_key [, mixed $ index_key = NULL] )
Возвращает значения из одного столбца ввода, идентифицируемого ключом column_. По желанию может быть предоставлен ключ index_key для индексации значений в возвращенном массиве по значениям из столбца index_key входного массива.
https://www.php.net/manual/en/function.array-column.php
Последний совет, и это удобство использования. Может быть, стоит сделать «контент» следующим образом:
while($row = mysqli_fetch_array($resultSeventeen)){
$options[$row['stateValue']] = $row['stateValue'].' - '.$row['stateName'];
}
//result ['MI'=> 'MI - Michigan]
Таким образом, когда пользователь вводит MI
или CA
и т. Д., Он будет эффективно искать значение, но по-прежнему будет отображать полное имя. Это то, что я использовал с такими вещами, как месяцы тоже. [1=>'1 - January']
и т.д ... Но, конечно, эта часть полностью зависит от вас. Я просто думаю, что это немного облегчает жизнь пользователю.
Summery
Прямо сейчас у вас есть 2 фрагмента "симуляционного" кода. Разве не было бы хорошо иметь только один, тогда вы знаете, что это работает. Он отлично справляется со своей задачей, и вы можете сосредоточить свое внимание на других частях приложения. Если это не сработает, вы будете достаточно уверены, что ошибка кроется в другом месте, поэтому отладка будет проще и т. Д. *
Это просто хорошая практика, делать функции, которые делают одно, хорошо. Не процедурный код, который делает много вещей плохо и является бесполезным для отладки. Тогда, когда вы хотите создать больше Datalists, даже из несвязанных данных, вам никогда не придется снова касаться этого кода. Это просто работает.
Надеюсь, это поможет вам.