Hatena::ブログ(Diary)

A Small, Good Thing - diary このページをアンテナに追加 RSSフィード Twitter

A Small, Good Thing

2010-12-20

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

PHP Advent Calendar 2010 の20日目です。昨日は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()が正解。配列演算子の「+」は左側の配列にすでにキーがあったら上書かないんだそうです。

404 Not Found

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

<?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 さんです。

それでは。

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

heavenshellheavenshell 2010/12/20 16:58 前日は私じゃないですよ(汗)
id:hamaco さんです

omoonomoon 2010/12/20 17:01 id:heavenshell さん
失礼しました、訂正しておきましたー。汗。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/omoon/20101220/1292831274
最近のコメント
プロフィール

omoon

omoon

30代、男、縄文系

日記の検索

Connection: close