PHP: непреднамеренный многомерный массив, состоящий из единичных

Я ищу один столбец в одной таблице моей базы данных для разных записей, используя этот оператор:

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 не решило эту проблему. Но в чем именно проблема?

Кто-нибудь когда-нибудь видел что-то подобное и есть идеи, как это решить?

Заранее спасибо.

боковой узел: вместо того, чтобы использовать while(mysqli_fetch_row()){....} только для генерации полного массива, вы должны использовать $array = $result->fetch_all();, который примерно на 30% быстрее. php.net/manual/en/mysqli-result.fetch-all.php

dognose 27.10.2018 16:34

@ bear87 Решение использовать fetch_all() или нет зависит исключительно от того, собираетесь ли вы перебирать данные «в том же слое / скрипте» (это упоминается в php.net/manual/en/mysqli-result.fetch-all.php). По сути, чтобы предложить лучшие практики, нам нужно знать, кто вы дальше делаем с данными. Вы просто переносите эти данные в другое место или просто выводите их на экран? вы взрываете данные? с чем? Не стесняйтесь оставлять отзывы, чтобы я мог быть более информативным.

mickmackusa 28.10.2018 05:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
33
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

mysqli_fetch_row() возвращает массив столбцов в SQL, поэтому, когда вы добавляете его в массив ...

$array[] = $row; 

Это создаст массив из каждой строки, который является массивом массивов. Если вместо этого вы добавите значение столбца в массив ...

$array[] = $row[0];

Это должно дать результат после.

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), поскольку он сохраняет цикл.

Nigel Ren 27.10.2018 16:50

Другие вопросы по теме