PHP | extract()で連想配列のキー名と値で変数とする方法

PHP,PHP 変数

PHPのextract()関数を使って連想配列のキー名を使った変数名にして変数を生成または上書きし、値を生成した変数の値を挿入する方法です。

連想配列のキー名を変数名にして値を挿入する

extract()関数は配列からシンボルテーブルに変数をインポートします。

extract ( 対象の連想配列 , flags , prefix )

いくつかの重要なパラメータがありますが、指定する連想配列内のキー名と同じ名前の変数名が存在しない事が確実な場合、またはその変数が上書きされる事が想定内の場合は、flagsとprefixは省略しても問題ありません。

$array = ['apple' => 'リンゴ', 'pine' => 'パイン', 'banana' => 'バナナ'];
extract($array);
echo $apple . ' / ' . $pine . ' / ' . $banana;

//リンゴ / パイン / バナナ

extract()のflagsパラメータ一覧

指定可能なflagsパラメータの一覧です。

flagsパラメータでは、連想配列のキー名から変数名を生成する処理の過程で、既に同一の変数名が存在した場合の処理方法を指定します。

省略した場合、デフォルト値の「EXTR_OVERWRITE(既に存在する場合、上書きする)」が適用されます。

flagsパラメータ内容
EXTR_OVERWRITE(デフォルト値)既に存在する場合、上書きする
EXTR_SKIP既に存在する場合、処理をスキップする
EXTR_PREFIX_SAME既に存在する場合、prefixを前に付ける
EXTR_PREFIX_ALL全ての変数名の前にprefixを付ける
EXTR_PREFIX_INVALID無効または数値の変数名の場合にprefixを付ける
EXTR_IF_EXISTS既に存在する場合、上書きする
EXTR_PREFIX_IF_EXISTS既に存在する場合、prefixを付ける
EXTR_REFS変数を参照として展開する

flagsパラメータについて

flagsパラメータが「EXTR_PREFIX_SAME」「EXTR_PREFIX_ALL」「EXTR_PREFIX_INVALID」「EXTR_PREFIX_IF_EXISTS」の場合は接頭辞prefixを付ける必要があります。

接頭辞prefixパラメータは文字列として指定しますが、先頭文字に数値や記号を指定する事はできません。

また、生成される変数名は「prefix_キー名」というように自動的にアンダースコアが付く事に注意します。

処理の過程で、既に同一の変数名が存在する場合に「EXTR_PREFIX_SAME」などのパラメータを指定する事で上書きを回避しつつ、新しい変数を作成できます。

$apple = 'りんご';
$array = ['apple' => 'リンゴ', 'pine' => 'パイン', 'banana' => 'バナナ'];
extract($array, EXTR_PREFIX_SAME, 'neo');
echo $apple . ' / ' . $neo_apple;

//りんご / リンゴ

連想配列のキー名が数値または先頭文字が数値であった場合など、変数名として許可されないキー名が含まれる可能性がある場合は、「EXTR_PREFIX_INVALID」「EXTR_PREFIX_ALL」を指定します。

$array = ['1' => 'リンゴ', '2' => 'パイン', '3' => 'バナナ'];
extract($array, EXTR_PREFIX_INVALID, 'fruits');
echo $fruits_1 . ' / ' . $fruits_2 . ' / ' . $fruits_3;

//リンゴ / パイン / バナナ

大きなプログラムの場合の安全性を考えると、やはり「EXTR_PREFIX_ALL」を指定してprefixには、確実にプログラム上で使われる可能性のない値を付けるしかないのかもしれません。

PHP,PHP 変数

Posted by Yousuke.U