compact

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

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

描述

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

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

对于这些参数中的每一个,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 的 超级全局数组 在函数中一起使用,所以超级全局数组不能传递给 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
= "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() 作为字符串。我希望这能进一步澄清手册中提到的要点吗?
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
10 个月前
如果你必须在知道变量可能未设置的情况下使用它,那么你需要使用另一种方法。

所以不要使用以下方法

<?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