佐賀でふらふり

佐賀をうろつくWebデザイナーのブログ

Web制作

0はemptyじゃなくてissetで判定する


うちの子は少年野球をやっていて、6年生が引退して、つい先日から新チームとして動き始めました。
これからシーズンオフまで、気づけば土日が終わってる…。そんな週末が続きます。

その少年野球チームのオフィシャルホームページとは別に、試合に来られない親御さんに試合の様子を伝えられたらいいなと思って、写真メインのホームページを僕が勝手に作ったんです。

その中にスコアボードの入力、表示する部分を作ったんですが、うまく表示することができずに悩んでしまいました。

目次

  1. 作ったものの概要
  2. 0の判定はisset
  3. まとめ

作ったものの概要

管理画面にカスタムフィールドで、チーム名と7回までの入力欄を作ってあげて、そこに入力したものを、表に表示する。ただそれだけ。
簡単ですよね?

僕も簡単だと思ってました。

ただ、書いてみたプログラムでは、チーム名はなんなく表示されたんですが、スコアが表示されない。
いや。出るには出るんだけど、点が入った時しか出ない。

かなり悩みました。

0は存在する?しない?

データベースみると、値は入ってるのが確認できたので、表示部分がおかしいことは確実。

では、その表示用するためのコードはというと。

$omote = array();
$ura = array();
for($i=0; $i<8; $i++) {
    //カスタムフィールド
    $get_field_omote = 'scorebord_omote'.$i;
    $get_field_ura = 'scorebord_ura'.$i;
    $get_field_omote_val = get_post_meta($id,$get_field_omote,true);
    $get_field_ura_val = get_post_meta($id,$get_field_ura,true);
    if(!empty($get_field_omote_val)) {
        $omote[] = $get_field_omote_val;
    }
    if(!empty($get_field_ura_val)) {
        $ura[] = $get_field_ura_val;
    }
}

これです。
カスタムフィールドには連番がふってあるので、for文でループさせて、配列に入れておいて、表示させるようにしています。

データベースには入ってたので、この配列をダンプしてみると、

あれ?0が入ってない。
データベースに0が存在してるけど、配列には存在していない。

表にでてないから、配列に存在してないのはあたりまえなのかもしれませんが、このときは何が間違いなのかわからなくて。
配列って0ダメなのかなと思って、stringにしてみたりしてました。

0の判定はisset

実は配列にカスタムフィールドの値を追加する際の判定がおかしかったんです。

    if(!empty($get_field_omote_val)) {
        $omote[] = $get_field_omote_val;
    }

この部分。(裏も同じ)

!emptyで「からっぽじゃなかったら」を判定していたんですが、!emptyでは「0」を「からっぽ」として扱ってしまうんです。
PHP: empty – Manual

なので、この条件ではスコアが0点だった場合に、配列に追加されないので表示されない。ということだったわけです。

では、「0」を「0」として判定してくれるもの、それは「isset」を使うと可能でした。
PHP: isset – Manual

「isset」は変数に何かしらセットされてれば、trueを返してくれるだそうで。
先程のコードを

    if(isset($get_field_omote_val)) {
        $omote[] = $get_field_omote_val;
    }

こうやって書き換えます。
いやぁ、原因がわかってよかった。

そこで該当箇所を「!empty」から「isset」に変更したら

バッチリ表示されました!

まとめ

そもそも変数がからっぽかどうかを「!empty」でずーっと判定し続けていたので、こんな事にハマってしまって…。
emptyやissetみたいに、似てるけど使い所が違ったり、扱うところが違ったり、という関数を惰性ではなくてもっと理解深めていく必要がありそうだなぁ…。

またこんなところで躓かないように、こうやってメモするところから、一歩ずつ…。

そいぎ~


返信する

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA