[PHP] list関数の便利な使い方 | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

配列を分解して別の変数に取り込みたいときに、その配列のキーから一つずつ取り出していくコードを書くと全体としてソースの量が増えたり、見づらくなったりします。

そういったときに、list関数 を使えば短いコードで簡単に実現できたりします。



文字列を分解してlistで一気に取り込む


例えば、date関数で日付を取得し、それをそのままの形で使いたいんだけど、一部のロジックでその中の年や月だけを利用したいと言った場合、explodeで文字列分解しつつその内容をダイレクトに変数に取り込むことができます。


- explodeした内容を各々の変数に一気に格納する
<?php

$date = date('Y/m/d');
list($year, $month, $day) = explode("/", $date);

echo $date . "\n";
echo $year . "-" . $month;


これは、下記のように何回もdate関数を呼び出す必要がありません。


<?php

$year  = date('Y');
$month = date('m');
$day   = date('d');

echo $year . "/" . $month . "/" . $day . "\n";
echo $year . "-" . $month;


この使い方は、上記以外でもCSVからデータを取り込む際に、各行ごとのデータをわかりやすい変数に格納していくことができたりします。


<?php

$fp = fopen("./hoge.csv", "r");

while(list($num, $name, $email) = fgetcsv($fp, 1024)) {
    echo "number:" . $num . "\n";
    echo "name:" . $name . "\n";
    echo "email:" . $email . "\n";
}


配列を返す関数からlistで一気に別の変数に取り込む


元々listは配列から別変数に取り込むために用意されていたりしますが、ユーザー関数を作りそれが配列を返す仕様にしていると、受け取り先でまた分解してと言うことが面倒になる場合もあります。

そういうときに、listを使って一気に別変数に値を格納させることが出来ます。


<?php

function getFruits() {
    return array("apple", "banana", "orange");
}

list($apple, $banana, $orange) = getFruits();


なお、listは受け取る側の変数(list内で定義した変数)が少ない分にはエラーが出ません。

なので、関数の仕様が変わり、戻り値の配列の中の数が変化しても影響を受けません。

(list内の受け取り側の変数の数の方が多くなってしまうと構文エラーがでます。)


<?php

function getFruits() {
    return array("apple", "banana", "orange");
}

list($apple, $banana) = getFruits();


listでは基本的に配列を返す仕様のものであれば、何でも取り込むことが出来るのですが、連想配列は分解して受け取ることができません。

また、配列のキーは0から順番にそろってなければいけません。

下記のように、キーが飛び飛びの場合は構文エラーが発生します。


<?php

$array[0] = "apple";
$array[3] = "banana";
$array[5] = "orange";

list($val1, $val2, $val3) = $array;

PHPの関数では、配列を返すものも多いため、組み合わせ次第では便利に使える関数ではないでしょうか。

例えば、DBの検索クエリの結果をダイレクトに別変数に格納したり。


<?php

$conn = pg_pconnect("dbname=hoge");

$result = pg_query($conn, "select name, email from test_tab");

while (list($name, $email) = pg_fetch_row($result)) {
    echo $name . "/" . $email . "\n";
}