Преобразование результатов запроса в массивы: руководство PHP

Раздел: Работа с данными -> Преобразование данных

Основные методы преобразования запроса в массив

Как получить все строки результата SQL-запроса в виде ассоциативного массива с помощью PDO?

Наиболее эффективное решение - использование PDO и метода fetchAll(PDO::FETCH_ASSOC). Этот способ обеспечивает безопасность через подготовленные запросы и гибкость в выборе формата данных.

try {
    $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
    $stmt = $pdo->prepare('SELECT id, name, email FROM users WHERE status = :status');
    $stmt->execute(['status' => 1]);
    $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
    print_r($users);
} catch (PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

Php запрос в массив (преобразование запроса в массив в php)

Array
(
    [0] => Array ([id] => 1 [name] => Иван [email] => ivan@example.com)
    [1] => Array ([id] => 2 [name] => Мария [email] => mary@example.com)
)

Типичные ошибки и их решение:

  • Отсутствие расширения PDO - установить php-pdo и драйвер для конкретной БД.
  • Неправильный DSN - проверить хост, имя базы, кодировку.
  • Игнорирование исключений - обернуть код в try-catch и включить PDO::ERRMODE_EXCEPTION.

Цель использования: получение набора данных в виде массива для дальнейшей обработки в PHP (циклы, фильтрация, вывод). Подходит для любых проектов, особенно современных.

Как выполнить то же самое с помощью MySQLi (объектный стиль)?

В MySQLi для выборки всех строк используется комбинация fetch_all(MYSQLI_ASSOC).

$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$stmt = $mysqli->prepare('SELECT id, name, email FROM users WHERE status = ?');
$stmt->bind_param('i', $status);
$status = 1;
$stmt->execute();
$result = $stmt->get_result();
$users = $result->fetch_all(MYSQLI_ASSOC);
print_r($users);
Array
(
    [0] => Array ([id] => 1 [name] => Иван [email] => ivan@example.com)
    [1] => Array ([id] => 2 [name] => Мария [email] => mary@example.com)
)

Возможные сложности:

  • Не забыть вызвать get_result() перед fetch_all, иначе метод недоступен.
  • При процедурном стиле та же логика, но функции начинаются с mysqli_.
  • Большие наборы данных могут потребовать больше памяти, чем fetch_assoc в цикле.

Как преобразовать строку HTTP-запроса (query string) в массив параметров?

Стандартная функция parse_str разбирает строку и помещает результат в переменную.

$query = 'name=Иван&age=30&city=Москва';
parse_str($query, $params);
print_r($params);
Array
(
    [name] => Иван
    [age] => 30
    [city] => Москва
)

Типичные ошибки:

  • Забыть указать второй аргумент - parse_str заполнит глобальные переменные. Решение: всегда передавать массив.
  • Некорректная кодировка - использовать rawurlencode при формировании строки.

Применение: обработка параметров GET-запросов, разбор URL, создание ссылок с динамическими параметрами.

Как получить массив из JSON-запроса (например, тела POST или ответа API)?

Функция json_decode с аргументом true возвращает ассоциативный массив.

$json = '{"user":{"id":1,"name":"Петр"},"roles":["admin","editor"]}';
$data = json_decode($json, true);
print_r($data);
Array
(
    [user] => Array ([id] => 1 [name] => Петр)
    [roles] => Array ([0] => admin [1] => editor)
)

Проблемы:

  • Некорректный JSON - проверить через json_last_error_msg().
  • Большие вложенные структуры - можно лимитировать глубину вторым параметром $depth.

Когда использовать: обработка данных от внешних API, чтение конфигурационных файлов в формате JSON, парсинг POST-запросов с Content-Type: application/json.

Существует ли способ преобразования CSV-запроса (строки с разделителями) в массив?

Для одной строки CSV используется str_getcsv. Для файла - fgetcsv или SplFileObject.

$csvLine = 'Иван;30;Москва';
$data = str_getcsv($csvLine, ';');
print_r($data);
Array
(
    [0] => Иван
    [1] => 30
    [2] => Москва
)

Распространенные ошибки:

  • Неправильный разделитель (например, точка с запятой vs запятая).
  • Экранирование кавычек - функция учитывает правила CSV, но можно задать символ enclosure.

Цель: импорт табличных данных из электронных таблиц или экспорт в плоский формат.

Как преобразовать XML-запрос в массив без использования SimpleXML?

Функция simplexml_load_string возвращает объект, который затем конвертируется в массив через json_decode(json_encode($xml), true).

$xml = '<root><item id="1">Значение</item></root>';
$xmlObj = simplexml_load_string($xml);
$array = json_decode(json_encode($xmlObj), true);
print_r($array);
Array
(
    [item] => Array ([@attributes] => Array ([id] => 1) [0] => Значение)
)

Нюансы:

  • Атрибуты помещаются в ключ @attributes.
  • При множественных элементах с одинаковым именем может потеряться структура - использовать XPath или DOMDocument для сложных случаев.

Применение: работа с устаревшими API, файлами конфигурации в XML, преобразование в универсальный формат.

Расширенные примеры преобразования запросов в массивы

Пример 1: Выборка с группировкой и агрегацией через PDO, результат в виде ассоциативного массива с сохранением типов данных (PDO::FETCH_ASSOC + настройка атрибутов).

Пример
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$stmt = $pdo->query('SELECT department, COUNT(*) as cnt FROM employees GROUP BY department');
$departments = $stmt->fetchAll();
print_r($departments);
Array
(
    [0] => Array ([department] => IT [cnt] => 12)
    [1] => Array ([department] => HR [cnt] => 5)
)

Пример 2: Использование fetchAll(PDO::FETCH_KEY_PAIR) для преобразования двух столбцов в ассоциативную карту id => name.

Пример
$stmt = $pdo->query('SELECT id, name FROM users LIMIT 3');
$map = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
print_r($map);
Array
(
    [1] => Иван
    [2] => Мария
    [3] => Петр
)

Пример 3: Преобразование query string с дублирующимися параметрами в массив значений (например, a[]=1&a[]=2)

Пример
$query = 'category[]=books&category[]=music&sort=asc';
parse_str($query, $result);
print_r($result);
Array
(
    [category] => Array ([0] => books [1] => music)
    [sort] => asc
)

Пример 4: Ручное преобразование строки запроса с помощью explode и array_map (для демонстрации работы принципа).

Пример
$query = 'key1=val1&key2=val2';
$pairs = explode('&', $query);
$array = [];
array_walk($pairs, function($pair) use (&$array) {
    list($key, $value) = explode('=', $pair, 2);
    $array[urldecode($key)] = urldecode($value);
});
print_r($array);
Array
(
    [key1] => val1
    [key2] => val2
)

Пример 5: Преобразование JSON-запроса с глубокой вложенностью и проверка ошибок.

Пример
$json = '{"data":[{"id":1,"tags":["php","array"]}]}';
$array = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
print_r($array);
Array
(
    [data] => Array ([0] => Array ([id] => 1 [tags] => Array ([0] => php [1] => array)))
)

Пример 6: Использование array_column для извлечения одного поля из массива результатов SQL-запроса.

Пример
$users = $pdo->query('SELECT id, email FROM users')->fetchAll(PDO::FETCH_ASSOC);
$emails = array_column($users, 'email', 'id');
print_r($emails);
Array
(
    [1] => ivan@example.com
    [2] => mary@example.com
    [3] => petr@example.com
)

Преобразование запроса в массив в PHP - comments

En
Php запрос в массив (php)