PHPのcompact関数の使い方!変数から連想配列を効率的に作成する

PHPのcompact関数は、指定された変数名とその値から連想配列を効率的に作成するために使用されます。

特に、複数の変数をまとめて関数に渡したい場合や、テンプレートシステムに変数を引き渡す際など、コードを簡潔に保ちたい場合に非常に便利です。
変数名を文字列として渡すだけで、その名前をキー、変数の値を値とする連想配列を自動的に生成します。

この記事では、compact関数の基本的な使い方、引数、戻り値、主要な使用例、そして使用する際の注意点について解説します。

compact関数の基本的な構文

compact関数の基本的な構文は以下の通りです。

compact(string|array $var_name, string|array ...$var_names): array
  • $var_names: 必須。連想配列のキーとして使用したい変数名(文字列)です。複数の変数名をカンマ区切りで指定することも、変数名の配列として指定することもできます。

compactの戻り値

指定された変数名と、その値から作成された新しい連想配列が返されます。

重要な点

  • compactは、指定された変数名が現在のスコープに存在しない場合、その変数をスキップします。エラーは発生しません。
  • 変数名が文字列として渡される必要があります。

$var_names(変数名)

  • 必須です。
  • 連想配列のキーとなる変数名を指定します。

下記の2つのように、どちらの指定の方法でも同じ結果になります。

  1. 複数の変数名をカンマ区切りで指定する
compact('var1', 'var2', 'var3');
  1. 変数名の配列として指定する
$varNames = ['var1', 'var2', 'var3'];
compact($varNames);

compact関数を使ってみる

compact関数を実際に使って、動作を確認してみます。

例1:複数の変数を指定して連想配列を作成する

最も基本的な使い方です。
複数の変数を直接compact関数に渡します。

<?php
$name = "Alice";
$age = 30;
$city = "New York";

// 変数名(文字列)を直接指定
$userData = compact('name', 'age', 'city');

print_r($userData);
/*
出力:
Array
(
    [name] => Alice
    日付未入力 => 30
    [city] => New York
)
*/
?>

$name$age$cityという変数を作成しています。
その次の処理でcompact関数を使って、変数名を指定しています。

出力して確認すると、それぞれの変数名をキー、その値を値とする連想配列に変換されています。

例2:変数名の配列を渡して連想配列を作成する

変数名を配列にまとめて、compact関数に渡すこともできます。

<?php
$productName = "Laptop";
$price = 1200;
$stock = 50;

$productVars = ['productName', 'price', 'stock'];

// 変数名の配列をcompactに渡す
$productInfo = compact($productVars);

print_r($productInfo);
/*
出力:
Array
(
    [productName] => Laptop
    [price] => 1200
    [stock] => 50
)
*/
?>

変数を3つ作成して、次の処理で、変数名を並べた$productVars配列を作成しています。
$productVars配列をcompact関数に渡すことで、変数名とその値の連想配列を作ることができます。

この方法は、動的に変数名を生成して配列に格納し、それをcompactに渡す場合に特に便利です。

例3:存在しない変数を指定した場合の挙動

compact関数は、指定された変数名に対応する変数が存在しない場合、その変数をサイレントにスキップします。
エラーは発生しないので、注意が必要です。

<?php
$existingVar = "Hello";
// $nonExistentVar は定義されていない

$result = compact('existingVar', 'nonExistentVar', 'anotherVar');

print_r($result);
/*
出力:
Array
(
    [existingVar] => Hello
)
*/
?>

$existingVar変数を作成して、次の処理でcompact関数を使っています。
渡しているのはexistingVar(変数名)と、そのほか2つの存在しない変数名です。

$nonExistentVar$anotherVarは定義されていないため、結果の配列には含まれていません。

例4:テンプレートへの変数引き渡し(概念的な例)

フレームワークや独自テンプレートシステムでも、ビューに変数を渡す際によく似た概念が使われます。

<?php
// コントローラーやビジネスロジックで準備されたデータ
$pageTitle = "商品詳細";
$productId = 123;
$productName = "スマートウォッチ";
$productPrice = 299.99;

// compactを使って、ビューに渡す変数をまとめる
$viewData = compact('pageTitle', 'productId', 'productName', 'productPrice');

// 実際のテンプレートファイルでは、$viewDataが展開されて変数が使えるイメージ
// 例えば、extract($viewData); のようにして、各変数を直接利用できるようにする

echo "--- テンプレートに渡されるデータ ---" . PHP_EOL;
print_r($viewData);
/*
出力:
--- テンプレートに渡されるデータ ---
Array
(
    [pageTitle] => 商品詳細
    [productId] => 123
    [productName] => スマートウォッチ
    [productPrice] => 299.99
)
*/
?>

この例では$viewDataとしてまとめられた配列が、あたかもテンプレートに直接渡されるかのように表現されています。
これにより、変数を個別に渡すよりもコードがすっきりします。

compact関数を使う際の注意点

compact関数を使う際の注意点です。

変数スコープ

compactは、関数が呼び出された現在のスコープに存在する変数のみを対象とします。
例えば、関数内でcompactを呼び出した場合、その関数内で定義されたローカル変数や、useキーワードでインポートされた変数などが対象となります。

グローバル変数や別の関数内で定義された変数は、明示的にglobalキーワードで宣言するか、$GLOBALS配列を通じてアクセスしない限り、compactの対象にはなりません。

変数名は文字列で指定

compactに渡す引数は、必ず変数名を表す文字列である必要があります。
変数そのもの(例: $name)ではなく、変数名(例: 'name')を渡します。

存在しない変数はスキップされる

前述の通り、指定した変数名に対応する変数が存在しない場合、compactは警告やエラーを出さずにその変数を無視します。
これはデバッグ時に見落としやすい点なので注意が必要です。

意図しない変数の欠落を防ぐために、事前に変数の存在を確認するか、慎重に変数名を指定してください。

可読性

多数の変数をcompactでまとめる場合、どの変数が含まれるのか一目で分かりにくくなることがあります。
変数の数が少ない場合や、特定のパターンでまとめる場合は便利ですが、多用しすぎるとコードの追跡が難しくなる可能性もあります。

compactと直接的な配列作成の違い

compactを使う代わりに、変数を直接連想配列にまとめることも可能です。

<?php
$firstName = "John";
$lastName = "Doe";

// compactを使用
$dataCompact = compact('firstName', 'lastName');
print_r($dataCompact);

// 直接配列を作成
$dataDirect = [
    'firstName' => $firstName,
    'lastName' => $lastName
];
print_r($dataDirect);
?>

compactのメリット

  • 簡潔さ: 変数名とキー名が同じ場合、変数名を一度書くだけで済み、コード量が減ります。
  • 動的な変数名: 変数名を文字列の配列として動的に生成し、一括で連想配列に変換する際に便利です。

直接配列作成のメリット

  • 明確さ: 変数とキーの対応関係がコード上で明確に示されます。
  • 柔軟性: キー名と変数名が異なる場合でも簡単に対応できます。
  • IDEのサポート: 多くのIDEでは、直接配列を作成する方が変数名の補完やリファクタリングの恩恵を受けやすい場合があります。

どちらを使うかは、状況と個人のコーディングスタイルによります。
変数名とキー名が常に一致し、コードの簡潔さを重視する場合はcompactが有効です。

まとめ

PHPの compact関数は、変数名とその値から連想配列を効率的に作成するための便利なツールです。
特に、複数の変数をまとめて扱う場合や、テンプレートエンジンに変数を渡す際などに、コードを簡潔に保つことができます。

しかし、変数スコープの考慮、変数名が文字列であること、そして存在しない変数がサイレントにスキップされる点など、いくつかの重要な注意点を理解して使用することが不可欠です。
これらのポイントを踏まえ、compact関数を効果的に活用し、PHPアプリケーションのコードをより整理されたものにしましょう。

PHP

コメント