也可以方便地用于调试,快速显示一堆变量及其值
<?php
print_r(compact(explode(' ', 'count acw cols coldepth')));
?>
给出
数组
(
[count] => 70
[acw] => 9
[cols] => 7
[coldepth] => 10
)
(PHP 4, PHP 5, PHP 7, PHP 8)
compact — 创建包含变量及其值的数组
创建一个包含变量及其值的数组。
对于每个变量,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
print_r(compact(explode(' ', 'count acw cols coldepth')));
?>
给出
数组
(
[count] => 70
[acw] => 9
[cols] => 7
[coldepth] => 10
)
考虑这两个例子。第一个在手册中使用,第二个是它的一个略微变化。
示例 #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()。我希望这能进一步阐明手册中提出的要点?
所以 compact('var1', 'var2') 与 array('var1' => $var1, 'var2' => $var2) 相同,只要 $var1 和 $var2 已设置。
如果您必须在知道变量可能未设置的情况下使用它,则需要使用另一种方法。
所以不要使用以下代码
<?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;
}
}
?>