omoonのブログ

旅の思い出を写真とともに書いてみるか。

phpで配列を扱う時のあれこれ ( #phpadvent2010 Day 20 )

PHP Advent Calendar 201020日目です。昨日はid:hamacoさんの「Sabelを試しつつバッチ処理を作ってみる (PHP Advent Calendar jp 2010 Day 19) - hamaco's diary」でした。

みなさんこんにちは。20日目担当のomoonです。普段は大阪でWEBアプリケーションを作ったりしている会社におりまして、PHPは触り始めて10年弱です。

今日は、PHPを触り始めたあの頃を思い出しながら、「うわ、こんな書き方するんや!」とか、「えー、そうなん?」っていう感じで、目からウロコが落ちた経験を、そしてその中でも特に「配列」の扱いについて落ちたウロコの数々を、つらつらと綴って行きたいと思います。よろしくお付き合いください。

P1030421.JPG

さて、PHPの配列って結構ややこしいですよねー。というか、告白しますと、僕も未だにあいまいなところもあったりします。なので、まずはマニュアルの以下のページを良ーく読むのがいいと思います。

おそらく、配列関数一覧のページは結構みなさん日常的に良く使うんじゃないかと推察するのですが、他の2つのページも結構大切だと思います。僕も、あれ?ってなったときは必ず読み返します。配列よくわからんーーって人は、じっくりと読むといいと思います。

ということで、細かいところはマニュアルに譲る*1として、今日は、僕の目から落ちたウロコですね。では、行ってみます。

[ウロコその1]配列の末尾に値を追加する

関数array_push()を使って、

<?php
$andys = array('woody');
array_push($andys, 'buzz');
?>

と書くのを、

<?php
$andys = array('woody');
$andys[] = 'buzz';
?>

とすることができる。最初知ったとき、うおーってなった。

[ウロコその2]配列を結合する

2つの配列を単純に結合したい、って場合。

<?php
$andys = array('woody', 'buzz');
$bonnies = array('mr_prickle_pants', 'trixie');
$new_bonnies = $bonnies + $andys;
print_r($new_bonnies);
/*
Array
(
    [0] => mr_prickle_pants
    [1] => trixie
)
*/
?>

単純に「+」でいいと思ったのに、あれ?

<?php
$andys = array('woody', 'buzz');
$bonnies = array('mr_prickle_pants', 'trixie');
$new_bonnies = array_merge($bonnies, $andys);
print_r($new_bonnies);
/*
Array
(
    [0] => mr_prickle_pants
    [1] => trixie
    [2] => woody
    [3] => buzz
)
*/
?>

これはarray_merge()が正解。配列演算子の「+」は左側の配列にすでにキーがあったら上書かないんだそうです。
http://jp.php.net/manual/ja/language.operators.array.php

なので、キーが違う場合、例えば、

<?php
$andys = array('a1' => 'woody', 'a2' => 'buzz');
$bonnies = array('b1' => 'mr_prickle_pants', 'b2' => 'trixie');
$new_bonnies = $bonnies + $andys;
print_r($new_bonnies);
/*
Array
(
    [b1] => mr_prickle_pants
    [b2] => trixie
    [a1] => woody
    [a2] => buzz
)
*/
?>

これなら大丈夫。

<?php
$andys = array('a1' => 'woody', 'a2' => 'buzz');
$bonnies = array('b1' => 'mr_prickle_pants', 'b2' => 'trixie');
$new_bonnies = array_merge($bonnies, $andys);
print_r($new_bonnies);
/*
Array
(
    [b1] => mr_prickle_pants
    [b2] => trixie
    [a1] => woody
    [a2] => buzz
)
*/
?>

もちろんarray_merge()でも同じ結果ですね。

次行ってみよー。

[ウロコその3]カンマとかで区切られた文字列を配列にする

<?php
$toys = "woody,buzz";
print_r(explode(",", $toys));
/*
Array
(
    [0] => woody
    [1] => buzz
)
*/
?>

explode()という関数がある。PHP: 配列 - Manual←このページにないから気付くの遅れました。

[ウロコその4]配列を文字列に分割

<?php
$toys = array('woody', 'buzz');
echo implode(",", $toys);
// woody,buzz
?>

implode()という関数がある。explode()の反対ですね。これもPHP: 配列 - Manual←このページにないから気付くの遅れたわー。

[ウロコその5]sqlプレースホルダを作る

<?php
// いくつあるのか分からない配列
$toys = array('woody', 'buzz', .....);
$pdo->prepare("select * from toys
        where name in (".implode(',',array_fill(0, count($toys), '?')).")");
$pdo->execute($toys);

配列の数から'?'だけの配列をarray_fill()で作ってimplode()。どこかで見たとき、おーってなった。

[ウロコその6]配列の文字コードを一括変換する

mb_convert_variables()という関数が使える。

cp932からutf-8へ変換したい場合は、

<?php
foreach ($array as $key => $value) {
    $array[$key] = mb_convert_encoding($value, 'utf-8', 'cp932');
}
?>

とかしなくても、

<?php
mb_convert_variables('utf-8', 'cp932', $array);
?>

で一発。しかし引数の順番がややこしいなー。

という感じで、かつて落としたウロコの数々に思いを馳せながら、駆け足で綴ってみました。皆さんも、他にこんなのあるよーってのがあれば、教えてください。

明日は、@ecworks_masap さんです。

それでは。

*1:PHPはオンラインマニュアルがしっかりしているのがいいところですね