W3docs

Функция compact() в PHP

Узнайте, как функция compact() в PHP создаёт ассоциативный array из переменных: синтаксис, примеры и типичные ошибки.

Что такое функция compact() в PHP?

compact() — это встроенная функция PHP, которая создаёт ассоциативный array из существующих переменных. Вы передаёте ей имена переменных (в виде строк), а она возвращает array, где ключами являются эти имена, а значениями — текущие значения переменных. Она является обратной функцией extract(), которая преобразует array обратно в отдельные переменные.

На этой странице рассматриваются синтаксис, принцип разрешения имён переменных функцией compact(), передача имён в виде array, поведение при значении null и отсутствующих переменных, а также типичный практический сценарий использования.

Синтаксис

compact(string|array ...$var_names): array

Каждый аргумент — это либо string с именем переменной, либо array таких строк. compact() возвращает результирующий ассоциативный array.

Как это работает?

compact() ищет переменные в текущей области видимости по каждому переданному имени. Если переменная с таким именем существует, она добавляется в результат (имя становится ключом, значение переменной — значением) — даже если значение равно null. Если переменной с таким именем не существует, это имя пропускается, а PHP 8.0+ выдаёт предупреждение («Undefined variable»).

Вот простейший пример:

Базовый пример compact()

php— editable, runs on the server

Мы создаём три переменные и передаём их имена в compact(). Результирующий array выглядит так:

Array (
  [name] => John
  [age] => 30
  [city] => New York
)

Обратите внимание: имена передаются без ведущего знака $"name", а не $name.

Зачем использовать compact()?

  • Меньше повторений: Вместо того чтобы писать ['name' => $name, 'age' => $age, 'city' => $city], вы пишете compact('name', 'age', 'city'). Ключ и имя переменной автоматически остаются синхронизированными.
  • Читаемость: Когда ключ array и переменная уже имеют одинаковое имя, compact() избавляет от визуального шума дублирования каждой пары.
  • Меньше опечаток: При ручном написании пар ключ-значение легко ошибиться в ключе. С compact() ключ выводится из имени переменной.

Примеры

Переменная со значением null

php— editable, runs on the server

Здесь $state определена, но содержит null. Поскольку переменная существует, она всё равно включается — её значение в array равно null (что print_r отображает как пустое значение):

Array (
  [name] => John
  [age] => 30
  [city] => New York
  [state] => 
)

Имя, для которого нет соответствующей переменной в области видимости, — другой случай: оно полностью пропускается (и PHP 8.0+ выдаёт предупреждение). Таким образом, compact('name', 'missing') вернёт только ['name' => 'John'].

Передача имён в виде array

Любой аргумент может сам быть array имён, который compact() разворачивает. Это удобно, когда список полей формируется динамически:

<?php

  $name = "John";
  $age  = 30;
  $city = "New York";

  $fields = ["name", "age"];
  $myArray = compact("city", $fields);

  print_r($myArray);

?>
Array (
  [city] => New York
  [name] => John
  [age] => 30
)

Практический пример: передача данных в шаблон

compact() отлично подходит, когда нужно передать представлению или шаблону набор именованных значений, не создавая array вручную:

<?php

  function renderProfile() {
    $username = "jdoe";
    $role     = "admin";
    $isActive = true;

    // Pass all three as a tidy associative array
    return compact("username", "role", "isActive");
  }

  print_r(renderProfile());

?>
Array (
  [username] => jdoe
  [role] => admin
  [isActive] => 1
)

Советы и подводные камни

  • Передавайте имена переменных без знака $: compact("name"), а не compact($name).
  • compact() читает только текущую область видимости — внутри функции она видит локальные переменные этой функции, а не глобальные.
  • Она включает переменные со значением null, но пропускает имена, для которых нет соответствующей переменной (в PHP 8.0+ это вызывает предупреждение). Используйте isset() или заранее определите переменную, если она должна присутствовать.
  • Для обратного преобразования — превращения array в переменные — используйте extract(). Чтобы узнать, какие переменные существуют в текущей области видимости, см. get_defined_vars().

Связанные функции

  • extract() — обратная функция для compact(): импортирует ключи array как переменные.
  • get_defined_vars() — возвращает все переменные, определённые в текущей области видимости.
  • Ассоциативные массивы — тип array, который создаёт compact().

Практика

Практика
Какова роль функции 'compact()' в PHP?
Какова роль функции 'compact()' в PHP?
Was this page helpful?