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 выполняет обратную операцию — импортирует элементы массива в текущую таблицу символов в качестве переменных. Её используют для удобного извлечения данных, но с осторожностью из-за возможного перезаписывания существующих переменных.
Конструкция 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 существенных изменений в поведении функции не произошло.
Расширенные примеры использования
Имена переменных могут генерироваться в цикле или на основе условий.
<?
$userName = "Алексей";
$userAge = 25;
$userCity = "Казань";
$selectedKeys = [];
if (true) {
$selectedKeys[] = 'userName';
$selectedKeys[] = 'userCity';
}
$info = compact($selectedKeys);
print_r($info);
?>Array
(
[userName] => Алексей
[userCity] => Казань
)Удобная упаковка переменных для передачи в метод или шаблон.
<?
function renderView($data) {
extract($data);
echo "Имя: $name, Возраст: $age";
}
$name = "Мария";
$age = 28;
renderView(compact('name', 'age'));
?>Имя: Мария, Возраст: 28
Функция ищет переменные в текущей области, но можно использовать global для доступа к глобальным.
<?
$globalVar = "Я глобальная";
function test() {
global $globalVar;
$localVar = "Я локальная";
return compact('globalVar', 'localVar');
}
print_r(test());
?>Array
(
[globalVar] => Я глобальная
[localVar] => Я локальная
)Передача многомерного массива строк для создания сложной структуры.
<?
$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 используется сокращенная запись свойств объекта, позволяющая включать переменные с их именами в качестве ключей.
let city = "Москва";
let country = "Россия";
let data = {city, country};
console.log(data);{ city: 'Москва', country: 'Россия' }Compact в MySQL
В SQL нет подобной функциональности на уровне переменных. Обычно данные выбираются напрямую в запросах или задаются через инструкции SET.