Переменная, которую вы передаете в json_encode, должна быть массивом строк.например, ["red", "green", "blue"] или массив литералов объекта, например, [{"value": "red"}, {"value": "green"}, {"value": "blue"}]
Каждый раз, когда в цикле вам нужно добавить элемент к существующим элементам.
Во всех трех фрагментах кода я замечаю, что вы присваиваете текущий элемент переменной массива,вместо того, чтобы добавить его.Когда цикл завершится, единственным элементом в вашем массиве будет элемент, последний раз обработанный циклом.
Так что, если то, что вы вводите в поле, не соответствует этому одному элементу, автозаполнение ничего не показывает.
Вот мой PHP-код для построения массива строк перед отправкой его обратно в файл, который сделал запрос.
$fetchedArtists = $db->query($queryToGetArtists );
$json = '[';
$first = true;
while($row = $fetchedArtists->fetch_assoc())
{
if (!$first)
{
$json .= ',';
}
else
{
$first = false;
}
$artist = $row['artistName'];
$json .= '{"value":"'.$artist.'"}';
}
$json .= ']';
echo $json;