Função PHP Array compact
Aprenda como a função compact() do PHP cria um array associativo a partir de variáveis existentes, com sintaxe, exemplos e dicas explicados.
O que é a função compact() do PHP?
compact() é uma função nativa do PHP que cria um array associativo a partir de variáveis existentes. Você passa os nomes das variáveis (como strings) e ela retorna um array cujas chaves são esses nomes e cujos valores são os valores atuais das variáveis. É o inverso de extract(), que transforma um array de volta em variáveis individuais.
Esta página aborda a sintaxe, como compact() resolve nomes de variáveis, como passar nomes como um array, o que acontece com valores null e variáveis indefinidas, e um caso de uso real comum.
Sintaxe
compact(string|array ...$var_names): arrayCada argumento é uma string contendo um nome de variável ou um array dessas strings. compact() retorna o array associativo resultante.
Como funciona?
compact() pesquisa no escopo atual cada nome fornecido. Se uma variável com esse nome existir, ela é adicionada ao resultado (o nome vira a chave e o valor da variável vira o valor) — mesmo quando o valor é null. Se não existir tal variável, esse nome é ignorado, e o PHP 8.0+ emite um aviso ("Undefined variable").
Veja o caso mais simples:
Exemplo básico de compact()
Criamos três variáveis e passamos seus nomes para compact(). O array resultante fica assim:
Array (
[name] => John
[age] => 30
[city] => New York
)Observe que você passa os nomes sem o $ inicial — "name", não $name.
Por que usar compact()?
- Menos repetição: Em vez de escrever
['name' => $name, 'age' => $age, 'city' => $city], você escrevecompact('name', 'age', 'city'). A chave e o nome da variável ficam sincronizados automaticamente. - Legibilidade: Quando a chave do array e a variável já compartilham o mesmo nome,
compact()elimina o ruído visual de duplicar cada um. - Menos erros de digitação: Escrever pares chave-valor manualmente facilita errar a chave. Com
compact(), a chave é derivada do nome da variável.
Exemplos
Incluindo uma variável com valor null
Aqui $state está definida, mas contém null. Como a variável existe, ela ainda é incluída — seu valor no array é null (que print_r exibe como valor vazio):
Array (
[name] => John
[age] => 30
[city] => New York
[state] =>
)Um nome que não tem variável correspondente no escopo é um caso diferente: ele é completamente ignorado (e o PHP 8.0+ emite um aviso). Portanto, compact('name', 'missing') retorna apenas ['name' => 'John'].
Passando os nomes como um array
Qualquer argumento pode ser em si um array de nomes, que compact() achata. Isso é útil quando a lista de campos é criada dinamicamente:
<?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
)Uso real: passando dados para um template
compact() brilha quando você quer entregar a uma view ou template um conjunto de valores nomeados sem precisar montar o array manualmente:
<?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
)Dicas e armadilhas
- Passe os nomes das variáveis sem o sinal
$:compact("name"), nãocompact($name). compact()lê apenas o escopo atual — dentro de uma função, ela vê as variáveis locais daquela função, não as globais.- Ela inclui variáveis cujo valor é
null, mas ignora nomes sem variável correspondente (aviso no PHP 8.0+). Useisset()ou defina a variável antes se precisar que ela esteja presente. - Para fazer o caminho inverso — transformar um array em variáveis — use
extract(). Para inspecionar quais variáveis existem no escopo, vejaget_defined_vars().
Funções relacionadas
extract()— o inverso decompact(): importa chaves de array como variáveis.get_defined_vars()— retorna todas as variáveis definidas no escopo atual.- Arrays associativos — o tipo de array que
compact()produz.