便利なphp foreach のオプション? 8

答えだけ言うと単に型キャストですがw

foreachをまわす時

引数が配列じゃないとこんなメッセージが

Warning: Invalid argument supplied for foreach() in ******** on line 10

がでるかと思うんですが、これを出さないための対応方法。

今までこんな感じに処理してました。

if(is_array($def)){
foreach( $def as $k=>$v){
print $v;
}
}

が、実はこんな foreach の書き方がありました。。

foreach( (array) $def as $k=>$v){
print $v;
}

なるほど。。こういう型キャストの使い方があったのか。。

動作の説明

(array)$def

で $def を array に変換してるんですね。(ちなみにこれを type casting といいます。)
なので foreach のエラー(これは array じゃねーよ!)というエラーがでなくなると。

これでソースが2行も減りました。

ちなみに、 array だけじゃなく object や int もあります。
型の相互変換

でもさすがにこれはひどいな。。

$binary = b”binary string”;

最後

こんな芸当が可能に。

var_dump((object)(int)(string)true);
//string(1) “1” が表示

必殺 チェインタイプキャスティングw

8 thoughts on “便利なphp foreach のオプション?

  1. Reply pangzai1 5月 20,2009 10:39 AM

    大変勉強になりました。
    ちょうどこのエラーで悩んでいたところで
    おかげさまで解決できました。

  2. Reply Jakk 5月 20,2009 4:21 PM

    コメントありがとうございます。
    このエラー 地味によく出るエラーなので
    エラーを消すのもそうですが、
    エラーが出ないようにコードを書くのも重要ですよね。

  3. Reply 浜村拓夫 7月 3,2009 4:46 PM

    ちょっとした工夫で、すごく便利になる事例だと思います!
    とても参考になりました。
    どうもありがとうございます。(・∀・)

  4. Reply Jakk 7月 13,2009 1:30 PM

    コメントありがとうございます。
    うまくご活用していただけるとうれしいです
    ただやっぱり、このエラーがでるということは
    ソースコードを書いている自分がきちんと
    型を把握できていないということだと思いますので、
    そこも注意していきたいですね!

  5. Reply 浜野新一 7月 15,2009 2:11 PM

    管理人様

    お世話になっております。私は株式会社クランツという編集プロダクションの浜野新一と申します。メールアドレスが見当たらなかったので、コメント欄にて失礼いたします。
    このたびアスキー・メディアワークスが発行する、初級・中級者向けパソコン活用誌「アスキー・ドットPC」10月号で、「仕事に役立つ無料ソフト100本(仮題)」という特集を組むことになりました。
    その中でNeo Inspiration様の「TinyTodo」を、紹介および付録DVD-ROMに収録させていただきたくメールいたしました。
    下記に概要を付しますので、ご査収の上ご協力のほど何卒よろしくお願いいたします。

    ■掲載誌/月刊「アスキー・ドットPC」2009年10月号(2009/8/24発売)
    ■発行・発売/アスキー・メディアワークス
    ■企画タイトル/仕事に役立つ無料ソフト100本(仮題)
    仕事のあらゆるシーンで役立つ無料ソフトを100本掲載します。
    また、付録DVD-ROMにも記事との連動で掲載の無料ソフトを収録を予定いたしております。

    ■許諾いただきたい点
     (1)誌面にソフトの紹介記事(画面キャプチャ含む)、
        URL、作者名等を掲載させていただくこと
     (2)付録DVD-ROMにソフトを収録させていただくこと

    以上になります。お忙しいところ大変恐縮ですが、制作の都合上、
    なるべくお早めにお返事をいただければ幸いです。
    こちらの都合で多変申し訳ありませんが、ご配慮いただければ幸いです。
    ご不明な点や不都合な点がございましたら、何なりとお尋ね下さいませ。
    それでは、重ねてよろしくお願い申し上げます。

    なお、このコメントはご覧になりましたら削除なさっていただいても構いません。コメントを汚し、申し訳ございませんでした

  6. Reply Jakk 7月 16,2009 10:38 AM

    こちらメールにてご返答させて頂きます。
    ありがとうございました。

  7. Reply しん 1月 20,2011 3:13 PM

    foreach( (array) $def as $k=>$v){
    のキャストの使い方、思いつきもしませんでした。

    これまで
    if (count($def)) {
      foreach($def as $k=>$v) {
        …
    }
    のように記述していました。
    これで、インデントが1段階減らすことができます。

    すごく参考になりました。ありがとうございます。

  8. Reply admin 1月 27,2011 3:37 PM

    コメントありがとうございます。
    お役に立てて何よりです。

Leave a Reply