【PHP8.x】compact関数の使い方

compact関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

compact関数は、PHPにおいて、指定された変数名とその値から新しい連想配列を作成する関数です。この関数は、引数として一つ以上の文字列、または文字列の配列を受け取ります。各文字列は、現在利用可能なスコープ(ローカルスコープやグローバルスコープなど)にある変数の名前として解釈されます。

関数が実行されると、指定された変数名が連想配列のキーとなり、その変数に現在格納されている値が対応する値となる連想配列が生成され、戻り値として返されます。例えば、$nameという変数に"Alice"が、$ageという変数に30が格納されている場合、compact('name', 'age')を実行すると、['name' => 'Alice', 'age' => 30]のような配列が得られます。

この関数の主な用途は、複数の変数を効率的に一つの配列にまとめることです。これにより、特にテンプレートエンジンへのデータ渡しや、複数の引数を必要とする関数へのデータ準備など、コードをより簡潔に記述できるようになります。指定された変数名に対応する変数が存在しない場合でもエラーにはならず、単にその変数名は生成される配列に含まれません。システムエンジニアを目指す上で、変数管理をよりスマートに行うための便利なツールとして活用できます。

構文(syntax)

1<?php
2$name = "Alice";
3$age = 30;
4$user_info = compact("name", "age");
5?>

引数(parameters)

string|array $var_names, string|array ...$var_names

  • string|array $var_names: 配列または文字列で、作成したい連想配列のキーとなる変数名を指定します。
  • string|array ...$var_names: 可変長引数です。文字列または配列で、連想配列のキーとして使用する追加の変数名を指定します。

戻り値(return)

array

与えられた変数名と値をキー、値を要素とする連想配列を返します。

サンプルコード

compactとextractで変数操作する

1<?php
2
3/**
4 * compact() とその逆の操作である extract() の動作を実演します。
5 *
6 * compact() は指定された変数から連想配列を作成します。
7 * キーワード "opposite" (逆) に相当する関数は extract() で、
8 * これは連想配列から変数を作成します。
9 */
10function demonstrateCompactAndOpposite(): void
11{
12    // 1. 変数をいくつか定義します。
13    $title = 'PHP for Beginners';
14    $author = 'Taro Yamada';
15    $year = 2023;
16
17    echo "--- Step 1: 元の変数 ---\n";
18    echo "Title: " . $title . "\n";
19    echo "Author: " . $author . "\n";
20    echo "Year: " . $year . "\n\n";
21
22    // 2. compact() を使い、変数名とその値をキーと値のペアに持つ配列を生成します。
23    $bookData = compact('title', 'author', 'year');
24
25    echo "--- Step 2: compact() で生成された配列 ---\n";
26    print_r($bookData);
27    echo "\n";
28
29    // 3. extract() の動作を明確にするため、元の変数を一旦破棄します。
30    unset($title, $author, $year);
31
32    // 4. compact() の逆の操作である extract() を使います。
33    // 配列のキー ('title', 'author', 'year') が変数名として、
34    // 配列の値がその変数の値として現在のスコープに展開されます。
35    extract($bookData);
36
37    echo "--- Step 3: extract() で配列から展開された変数 ---\n";
38    // これで、$title, $author, $year という変数が再び利用可能になります。
39    echo "Title: " . $title . "\n";
40    echo "Author: " . $author . "\n";
41    echo "Year: " . $year . "\n";
42}
43
44// 関数を実行して動作を確認します。
45demonstrateCompactAndOpposite();
46

PHPのcompact()関数は、引数に指定された名前を持つ複数の変数を探し、それらを一つの連想配列にまとめる機能を提供します。引数には、配列に含めたい変数名を文字列で一つ以上指定します。関数を実行すると、指定された変数名をキーとし、その変数が持つ値を値とする連想配列が、戻り値として返されます。

このサンプルコードでは、まず$title$author$yearという3つの変数を定義しています。次にcompact('title', 'author', 'year')を呼び出し、これらの変数から$bookDataという名前の連想配列を生成しています。

compact()関数の逆の操作を行うのがextract()関数です。extract()は連想配列を引数に取り、その配列のキーをローカルな変数名として、値をその変数の値として現在のスコープに展開(作成)します。コードの後半では、extract($bookData)を実行することで、$bookData配列の内容から再び$title$author$yearという変数を復元しています。このように、compact()extract()は、変数と配列を相互に変換する際に役立つ、補完的な関係にある関数です。

compact()関数は、引数に変数そのものではなく、変数名の文字列を指定する点に注意が必要です。存在しない変数名を指定してもエラーにはならず、単に結果の配列に含まれないため、タイプミスに気づきにくい場合があります。逆の操作であるextract()は、配列のキーを現在のスコープに変数として展開する便利な関数ですが、特に注意が求められます。ユーザー入力のような信頼できない配列にextract()を使用すると、既存の変数が意図せず上書きされ、重大なセキュリティ問題を引き起こす可能性があります。そのため、extract()の利用は信頼できるデータに限定し、変数の上書きを防ぐオプションの利用を検討することが推奨されます。

PHP compact関数で連想配列を作成する

1<?php
2
3/**
4 * compact() 関数の使用例を示します。
5 * compact() は、指定された変数名とその値を連想配列として作成する際に使用されます。
6 * これは、複数の変数を関数やテンプレートに一度に渡す場合に特に便利です。
7 */
8function demonstrateCompact(): void
9{
10    // compact() 関数に含める変数群を定義します。
11    $firstName = "John";
12    $lastName = "Doe";
13    $age = 30;
14    $city = "Tokyo";
15    $occupation = "Software Engineer";
16
17    echo "--- 1. 個別の変数名を指定する compact() の例 ---" . PHP_EOL;
18
19    // 'firstName', 'lastName', 'age' という名前の変数とその値を含む配列を作成します。
20    // compact('firstName', 'lastName', 'age') は、
21    // ['firstName' => $firstName, 'lastName' => $lastName, 'age' => $age]
22    // と同等です。
23    $personalInfo = compact('firstName', 'lastName', 'age');
24    echo "compact('firstName', 'lastName', 'age') の結果:" . PHP_EOL;
25    print_r($personalInfo);
26    // 期待される出力: Array ( [firstName] => John [lastName] => Doe [age] => 30 )
27
28    echo PHP_EOL . "--- 2. 変数名の配列を指定する compact() の例 ---" . PHP_EOL;
29
30    // 変数名のリストを配列として定義します。
31    $jobVarNames = ['city', 'occupation'];
32
33    // 'city' と 'occupation' という名前の変数とその値を含む配列を作成します。
34    // compact(['city', 'occupation']) は、
35    // ['city' => $city, 'occupation' => $occupation]
36    // と同等です。
37    $jobDetails = compact($jobVarNames);
38    echo "compact(['city', 'occupation']) の結果:" . PHP_EOL;
39    print_r($jobDetails);
40    // 期待される出力: Array ( [city] => Tokyo [occupation] => Software Engineer )
41
42    echo PHP_EOL . "--- 3. 存在しない変数名を指定した場合の compact() の例 ---" . PHP_EOL;
43
44    // 存在しない変数名 'nonExistentVar' を指定した場合、そのキーは結果の配列に含まれません。
45    $mixedInfo = compact('firstName', 'nonExistentVar', 'age');
46    echo "compact('firstName', 'nonExistentVar', 'age') の結果:" . PHP_EOL;
47    print_r($mixedInfo);
48    // 期待される出力: Array ( [firstName] => John [age] => 30 )
49    // 'nonExistentVar' は定義されていないため、結果の配列には追加されません。
50}
51
52// 関数を実行して compact() の動作を確認します。
53demonstrateCompact();
54
55?>

PHPのcompact()関数は、現在のスコープに存在する変数から連想配列を生成する際に使用します。この関数は、変数名を文字列の引数として受け取り、その変数名をキー、変数が持つ値を値とする新しい配列を返します。

引数には、配列に含めたい変数の名前を文字列で一つ以上指定します。複数の変数名をカンマで区切って渡すことや、変数名を要素として持つ配列を渡すことも可能です。

戻り値は、引数で指定された文字列と同じ名前の変数から構成される連想配列です。例えば、$name = "John"という変数がある場合、compact('name')を実行すると ['name' => "John"] という配列が生成されます。

もし引数で指定した名前の変数が存在しない場合、そのキーと値のペアは結果の配列には含まれません。このため、未定義の変数を指定してもエラーが発生しないという特徴があります。compact()関数は、特に複数の変数をまとめて関数やテンプレートエンジンに渡す場合に、コードを簡潔にするのに役立ちます。

compact()関数は、引数に変数そのものではなく、変数名を表す「文字列」を指定する点に注意してください。指定した名前の変数が現在のスコープに存在しない場合、エラーは発生せず、単に結果の配列からそのキーが除外されます。そのため、変数名のタイプミスに気づきにくく、意図しないデータ欠損の原因となりえます。この挙動はデバッグを難しくする場合があるため、慎重な利用が求められます。多くの変数を扱う際にコードを短くできますが、可読性を重視するなら、通常の連想配列 ['key' => $value] を使う方が適切な場面もあります。

PHP compact関数を使わない連想配列作成

1<?php
2
3/**
4 * compact関数を使わずに、変数から連想配列を作成するサンプルコード。
5 *
6 * compact関数は文字列で変数名を指定するため、リファクタリング時に変数名が変更されても
7 * IDEが追従しにくく、エラーの原因になる可能性があります。
8 * そのため、明示的に連想配列を定義する方が、可読性と保守性の観点から推奨される場合があります。
9 */
10
11$userName = "山田 太郎";
12$userAge = 28;
13$userCity = "東京都";
14$userOccupation = "エンジニア";
15
16// compact関数を使わず、明示的に連想配列を定義する
17// キーと値の対応が明確になり、IDEの補完も効きやすくなります。
18$userInfo = [
19    'name' => $userName,
20    'age' => $userAge,
21    'city' => $userCity,
22    'occupation' => $userOccupation,
23];
24
25// 作成された配列の内容を出力して確認
26echo "--- compact関数を使わない連想配列の作成 ---" . PHP_EOL;
27print_r($userInfo);
28
29/*
30// 参考:もしcompact関数を使う場合
31// compact('userName', 'userAge', 'userCity', 'userOccupation') と記述することになります。
32// 文字列で指定するため、変数名の変更があった際に文字列も忘れずに変更する必要があり、
33// IDEによるリファクタリング支援が効きません。
34$userInfoCompact = compact('userName', 'userAge', 'userCity', 'userOccupation');
35echo PHP_EOL . "--- compact関数を使った連想配列の作成 (参考) ---" . PHP_EOL;
36print_r($userInfoCompact);
37*/
38
39?>

PHPのcompact関数は、複数の変数から、変数名をキーとし、その変数の値を値とする連想配列を簡単に作成するための機能です。引数には、連想配列のキーにしたい変数名を文字列、または文字列の配列として一つ以上指定します。戻り値は作成された連想配列です。

しかし、この関数は、変数名を文字列として渡すため、コードのリファクタリング、例えば変数名の変更を行った際に、開発環境(IDE)の自動追従が効きません。これにより、コードの保守性が低下し、意図しないエラーが発生するリスクがあります。

そのため、提示されたサンプルコードではcompact関数を使用せず、明示的に連想配列を定義する方法が示されています。具体的には、$userInfo = ['name' => $userName, 'age' => $userAge, ...]; のように、直接キーと値を指定して配列を作成しています。この方法を用いることで、どの変数がどのキーに対応するのかが明確になり、コードの可読性が大幅に向上します。また、変数名が変更された場合でもIDEがその変更を追従しやすくなるため、エラーを未然に防ぎ、長期的なコードの保守性を高めることができます。

このように、compact関数は手軽に連想配列を作成できる一方で、保守性の観点から明示的な定義が推奨される場面が多いことを理解しておきましょう。

compact関数は、変数名を文字列で指定するため、後から変数名を変更した場合にIDEが追従できず、エラーの原因になりやすい点に注意が必要です。また、どの変数がどのキーに対応するのか、コードを見ただけでは理解しにくい場合があります。

サンプルコードのように['キー' => $変数名]と明示的に連想配列を定義する方法は、キーと値の対応が明確になり、コードの可読性が向上します。さらに、IDEの自動補完やリファクタリング機能が正しく動作するため、保守性が高く、予期せぬバグの発生を防ぐことにつながります。安全で堅牢なコードを書くためにも、この記述方法を推奨いたします。

関連コンテンツ