Я ищу один столбец в одной таблице моей базы данных для разных записей, используя этот оператор:
SELECT DISTINCT column FROM table WHERE column entry LIKE '%keyword%'
Это отлично работает, поскольку сброс mysqli_query показывает мне ожидаемое количество записей для указанного ключевого слова. Затем я пытаюсь записать результат запроса в одномерный массив (массив объявлен где-то еще в коде):
while($row = mysqli_fetch_row($query)) {
$array[] = $row;
}
В результате я ожидаю получить простой числовой одномерный массив вроде этого:
Array(
[0] => value 1
[1] => value 2
...
)
При проверке результата с помощью print_r ($ array) я получаю такой массив:
Array(
[0] => Array([0] => value1)
[1] => Array([0] => value2)
...
)
Я не знаю, откуда взялась эта странная структура, поскольку это не единственный массив в моем коде. Я шаг за шагом проверил конкретный блок кода и пришел к выводу, что проблема заключается в создании массива. Использование mysqli_fetch_assoc не решило эту проблему. Но в чем именно проблема?
Кто-нибудь когда-нибудь видел что-то подобное и есть идеи, как это решить?
Заранее спасибо.
@ bear87 Решение использовать fetch_all()
или нет зависит исключительно от того, собираетесь ли вы перебирать данные «в том же слое / скрипте» (это упоминается в php.net/manual/en/mysqli-result.fetch-all.php). По сути, чтобы предложить лучшие практики, нам нужно знать, кто вы дальше делаем с данными. Вы просто переносите эти данные в другое место или просто выводите их на экран? вы взрываете данные? с чем? Не стесняйтесь оставлять отзывы, чтобы я мог быть более информативным.
mysqli_fetch_row
получает строку результатов в виде нумерованного массива. Помимо подхода Найджел Рен, вы также можете использовать mysqli_fetch_assoc()
. Он получит результирующую строку как ассоциативный массив. В качестве ключей будут использоваться имена столбцов, а не числа вроде 0, 1 ..; таким образом, более четкий подход.
Теперь у вас есть два варианта получения одномерного массива значений определенного столбца.
Получите доступ к значению столбца из строки результата, используя имя столбца в качестве ключа:
while($row = mysqli_fetch_assoc($result)) {
$array[] = $row['columnname'];
}
ИЛИ,
Сначала вы можете подготовить двухмерный массив (поскольку у вас может быть несколько столбцов); а затем используйте функцию array_column()
для получения значений определенного столбца в виде одномерного массива.
while($row = mysqli_fetch_assoc($result)) {
$array[] = $row;
}
// Extract values for a columnname key
$columnname_values = array_column($array, 'columnname');
ИЛИ,
Другой альтернативой, предложенной Найджел Рен в Комментарии, является использование функции mysqli_fetch_all()
.
$array = mysqli_fetch_all($result,MYSQLI_ASSOC);
// Extract values for a columnname key
$columnname_values = array_column($array, 'columnname');
Со вторым методом вы также можете использовать mysqli_fetch_all($result,MYSQLI_ASSOC)
, поскольку он сохраняет цикл.
боковой узел: вместо того, чтобы использовать
while(mysqli_fetch_row()){....}
только для генерации полного массива, вы должны использовать$array = $result->fetch_all();
, который примерно на 30% быстрее. php.net/manual/en/mysqli-result.fetch-all.php