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
= "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
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() 的作用相反,但務必理解 compact() 並非完全反轉 extract() 的操作。尤其要注意的是,compact() 並不會 unset() 傳入的變數(即使這些變數是由 extract() 建立的)。如果您希望在將個別變數組合成陣列後將其 unset(),則必須自行處理。
To Top