PHP Conference Japan 2024

compact

(PHP 4, PHP 5, PHP 7, PHP 8)

compact创建包含变量及其值的数组

描述

compact(数组|字符串 $var_name, 数组|字符串 ...$var_names): 数组

创建一个包含变量及其值的数组。

对于每个变量,compact() 会在当前符号表中查找具有该名称的变量,并将其添加到输出数组中,使变量名成为键,变量的内容成为该键的值。简而言之,它与extract()的功能相反。

注意:

在 PHP 7.3 之前,任何未设置的字符串都会被静默跳过。

参数

var_name
var_names

compact() 接受可变数量的参数。每个参数可以是一个包含变量名称的字符串,也可以是一个变量名称数组。数组可以在其中包含其他变量名称数组;compact() 会递归处理它。

返回值

返回包含所有已添加变量的输出数组。

错误/异常

compact() 如果给定的字符串引用了未设置的变量,则会发出E_WARNING级别的错误。

变更日志

版本 描述
8.0.0 如果给定的字符串引用了未设置的变量,现在会发出E_WARNING级别的错误。
7.3.0 compact() 现在如果给定的字符串引用了未设置的变量,则会发出E_NOTICE级别的错误。以前,此类字符串会被静默跳过。

示例

示例 #1 compact() 示例

<?php

$city
= "旧金山";
$state = "CA";
$event = "SIGGRAPH";

$location_vars = array("city", "state");

$result = compact("event", $location_vars);
print_r($result);

?>

上面的例子将输出

Array
(
    [event] => SIGGRAPH
    [city] => San Francisco
    [state] => CA
)

备注

注意: 陷阱

由于可变变量不能与PHP的超全局数组一起在函数中使用,因此超全局数组不能传递到compact()中。

参见

  • extract() - 从数组导入变量到当前符号表

添加备注

用户贡献的笔记 5 个笔记

M Spreij
17 年前
也可以方便地用于调试,快速显示一堆变量及其值

<?php
print_r
(compact(explode(' ', 'count acw cols coldepth')));
?>

给出

数组
(
[count] => 70
[acw] => 9
[cols] => 7
[coldepth] => 10
)
lekiagospel at gmail dot com
4年前
考虑这两个例子。第一个在手册中使用,第二个是它的一个略微变化。

示例 #1

<?php
$city
= "旧金山";
$state = "CA";
$event = "SIGGRAPH";

$location_vars = array("city", "state");

$result = compact("event", $location_vars);
print_r($result);
?>

上面的示例 #1 将输出

数组
(
[event] => SIGGRAPH
[city] => 旧金山
[state] => CA
)

示例 #2

<?php
$city
= "旧金山";
$state = "CA";
$event = "SIGGRAPH";

$location_vars = array("city", "state");

$result = compact("event", "location_vars");
print_r($result);
?>

上面的示例 #2 将输出

数组
(
[event] => SIGGRAPH

[location_vars] => 数组
(
[0] => city
[1] => state
)

)

在第一个例子中,变量 $location_values 的值(它是一个包含 city 和 state 的数组)传递给 compact()。

在第二个例子中,变量 $location_vars 的名称(即没有 '$' 符号)作为字符串传递给 compact()。我希望这能进一步阐明手册中提出的要点?
jmarkmurph at yahoo dot com
8年前
所以 compact('var1', 'var2') 与 array('var1' => $var1, 'var2' => $var2) 相同,只要 $var1 和 $var2 已设置。
c dot smith at fantasticmedia dot co dot uk
1年前
如果您必须在知道变量可能未设置的情况下使用它,则需要使用另一种方法。

所以不要使用以下代码

<?php
$var1
= "lorem";
$var2 = "ipsum";
$result = compact('var1', 'var2', 'unsetvar');
?>

考虑使用以下代码

<?php
$var1
= "lorem";
$var2 = "ipsum";
$result = [];
foreach( [
'var1', 'var2', 'unsetvar'] as $attr ) {
if ( isset( $
$attr ) ) {
$result[ $attr ] = $$attr;
}
}
?>
Robc
13年前
说明中提到compact与extract()相反,但重要的是要理解它并不能完全反转extract()。特别是,compact()不会unset()传递给它的参数变量(这些变量可能是extract()创建的)。如果您希望在将单个变量组合到数组后将其unset,则必须手动执行此操作。
To Top