Compact: примеры (PHP)

Руководство по работе с compact в PHP
Раздел: Работа с переменными
compact(string|array ...$vars): array

Описание функции compact в PHP

Назначение и использование

Функция compact создает ассоциативный массив, используя имена переменных в качестве ключей, а их значения — в качестве значений массива. Она часто применяется для удобной упаковки нескольких переменных в один массив, что упрощает передачу данных в функции, шаблоны или для логирования.

Аргументы функции

Функция принимает переменное количество аргументов. Каждый аргумент может быть:

  • Строкой, содержащей имя переменной.
  • Массивом строк с именами переменных.
  • Массивом массивов строк (вложенная структура).

Функция ищет переменные в текущей области видимости (локальной, глобальной, если указано) и добавляет их в результирующий массив. Если переменная с указанным именем не существует, она пропускается.

Короткие примеры применения compact

Простой пример

Создание массива из трех переменных.

<?
$city = "Москва";
$country = "Россия";
$population = 12678079;

$data = compact('city', 'country', 'population');
print_r($data);
?>
Array
(
    [city] => Москва
    [country] => Россия
    [population] => 12678079
)
Использование массива имен

Передача списка имен в виде массива.

<?
$name = "Иван";
$age = 30;
$keys = ['name', 'age'];
$result = compact($keys);
print_r($result);
?>
Array
(
    [name] => Иван
    [age] => 30
)
Комбинирование аргументов

Передача строк и массивов одновременно.

<?
$a = 1;
$b = 2;
$c = 3;
$array = compact('a', ['b', 'c']);
print_r($array);
?>
Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)

Похожие функции в PHP

Функция extract

extract выполняет обратную операцию — импортирует элементы массива в текущую таблицу символов в качестве переменных. Её используют для удобного извлечения данных, но с осторожностью из-за возможного перезаписывания существующих переменных.

Функция list

Конструкция list (начиная с PHP 7.1 — []) позволяет деструктурировать массив, присваивая его значения набору переменных. Она полезна для распаковки массивов с числовыми индексами.

Ручное создание массива

Прямое объявление ассоциативного массива через [] или array() дает полный контроль над структурой, но может быть менее удобно при работе с большим числом переменных.

Типичные ошибки при работе с compact

Несуществующие переменные

Если указать имя необъявленной переменной, функция проигнорирует её без предупреждения (если не включен строгий режим).

<?
$existing = "test";
$array = compact('existing', 'ghost');
print_r($array);
?>
Array
(
    [existing] => test
)
Передача не строковых значений

При передаче аргументов, не являющихся строками или массивами, функция может выдать предупреждение и не добавить элемент.

<?
$var = "value";
$array = compact($var, 42);
print_r($array);
?>
Warning: compact(): Undefined variable $value in ...
Array
(
)

История изменений функции

В PHP 7.3 была добавлена возможность передавать вложенные массивы строк в качестве аргументов. Это позволяет более гибко группировать имена переменных. В PHP 8 существенных изменений в поведении функции не произошло.

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

Динамическое формирование списка переменных

Имена переменных могут генерироваться в цикле или на основе условий.

Пример php
<?
$userName = "Алексей";
$userAge = 25;
$userCity = "Казань";

$selectedKeys = [];
if (true) {
    $selectedKeys[] = 'userName';
    $selectedKeys[] = 'userCity';
}
$info = compact($selectedKeys);
print_r($info);
?>
Array
(
    [userName] => Алексей
    [userCity] => Казань
)
Компактная передача в функции

Удобная упаковка переменных для передачи в метод или шаблон.

Пример php
<?
function renderView($data) {
    extract($data);
    echo "Имя: $name, Возраст: $age";
}

$name = "Мария";
$age = 28;
renderView(compact('name', 'age'));
?>
Имя: Мария, Возраст: 28
Работа с глобальными переменными

Функция ищет переменные в текущей области, но можно использовать global для доступа к глобальным.

Пример php
<?
$globalVar = "Я глобальная";
function test() {
    global $globalVar;
    $localVar = "Я локальная";
    return compact('globalVar', 'localVar');
}
print_r(test());
?>
Array
(
    [globalVar] => Я глобальная
    [localVar] => Я локальная
)
Вложенные массивы имён

Передача многомерного массива строк для создания сложной структуры.

Пример php
<?
$a = 1;
$b = 2;
$c = 3;
$d = 4;

$result = compact([['a', 'b'], ['c', 'd']]);
print_r($result);
?>
Array
(
    [a] => 1
    [b] => 2
    [c] => 3
    [d] => 4
)

Аналоги compact в других языках

Compact в Python

В Python нет прямой аналогии, но можно использовать словари и функции locals() или globals() для получения переменных из областей видимости.

city = "Москва"
country = "Россия"
data = {k: v for k, v in locals().items() if k in ['city', 'country']}
print(data)
{'city': 'Москва', 'country': 'Россия'}
JavaScript (ES6+)

В JavaScript используется сокращенная запись свойств объекта, позволяющая включать переменные с их именами в качестве ключей.

let city = "Москва";
let country = "Россия";
let data = {city, country};
console.log(data);
{ city: 'Москва', country: 'Россия' }

Compact в MySQL

В SQL нет подобной функциональности на уровне переменных. Обычно данные выбираются напрямую в запросах или задаются через инструкции SET.

PHP compact function comments

En
Compact Create array containing variables and their values