对于调试也很方便,可以快速显示一大堆变量及其值
<?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 = "San Francisco";
$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 = "San Francisco";
$state = "CA";
$event = "SIGGRAPH";
$location_vars = array("city", "state");
$result = compact("event", $location_vars);
print_r($result);
?>
上面的示例 #1 将输出
数组
(
[event] => SIGGRAPH
[city] => San Francisco
[state] => CA
)
示例 #2
<?php
$city = "San Francisco";
$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;
}
}
?>