• ベストアンサー

【PHP】count( )の結果に納得がいかない

PHP初心者です。 配列要素数を数えるcount()ですが納得いきません。 たとえば、 $myArray = array(); $myArray[0] = NULL; print count($myArray); とすると「1」となります。 NULL まで数えなくてもいいのに… NULLを数えたくないならどんな方法があるでしょうか? お詳しい方、よろしくお願いいたします。

  • PHP
  • 回答数6
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.3

NULLとは「何も入っていない状態」ではなく、 「NULLという値が入っている状態」であることが理解できれば、 count()が返してくる値が決して理不尽ではないことが おわかりいただけると思います。

takosuke88
質問者

お礼

NULL で存在をなくすことはできない… よくわかりました。 ありがとうございました。

その他の回答 (5)

  • SoHeart
  • ベストアンサー率50% (13/26)
回答No.6

訂正 $myArrayを[0] ↓ $myArray[0]を

  • SoHeart
  • ベストアンサー率50% (13/26)
回答No.5

4です。間違った事書いてました。 count()配列要素数を数える関数。 引数の渡し方によって数えるものが違うようです。 count($myArray) この場合、$myArrayを構成する要素は、$myArray[0] なので1が返ってきます。 count($myArray[0]) この場合、$myArrayを[0]構成する要素は、何もない ので0が返ってきます。

  • SoHeart
  • ベストアンサー率50% (13/26)
回答No.4

count() 配列数を数える関数 strlen() 文字数を数える関数 この場合、$myArray[0]が存在するので「1」 strlen($myArray[0])はNULLを数えず0を返します。

回答No.2

countは配列の要素数を数えるものであって、配列の中身を数えるものではありません。 $myArray[0] = NULL; とは、別の書き方をすると、 $myArray = array("0"=>); と同じ意味(ゼロと言うインデックスが存在します)です。 同じように、 $myArray[0] = NULL; $myArray[1] = "あいうえお"; だとしたら、 $myArray = array("0"=>,"1"=>"あいうえお"); となります。この配列をcountすれば2を返しますよね。 配列をインデックスごと無くす場合は、NULLではなく、unset($myArray[0])とする必要があります。 NULLがどうしても入ってしまい、NULLを数えたくないなら、 //--------------------------- function count_notnull ($myArray){ $cnt = count($myArray); $t=0; for($i=0:$i<$cnt;$i++){ if($myArray[$i] != "") $t++; } return $t; } //--------------------------- こんな関数を作ってみてはどうでしょうか。

takosuke88
質問者

お礼

やっぱunset()ですか。 考えを切り替えてみます。 ありがとうございました。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 んと… $myArray[0] = NULL; この場合。 正しくは「配列の0番目の要素にデータとしてNULLが入っている」状態です。 なので、「配列の数としては」1が返るのが正常な動作になります。 もし「データとしてNULL(や空文字など)が入っていた場合はカウントしたくない」ようであれば、 ・まず配列からNULLなどの要素をとりのぞく ・countににた別の関数(かクラス)を自作する 必要があるかと思います。 後は「データの格納部分でNULLなら格納しないようにする」のも手です。

takosuke88
質問者

お礼

なるほど。 NULL = 何もない という考えが間違いでしたか。 ありがとうございました。

関連するQ&A

  • 【PHP】配列の最後の要素のキーを知るには

    以下のような乱雑な配列があったとして中身がわからない場合、最後の要素のキーが「12」であることを知るにはどうすればいいでしょうか? お詳しい方、よろしくお願いいたします。 $myArray = array(); $myArray[2] = ''; $myArray[5] = 'a'; $myArray[9] = NULL; $myArray[12] = 'z';

    • ベストアンサー
    • PHP
  • 【PHP】配列のキー名の修正は可能ですか?

    PHP5利用者です。 例えば、 $myArray = array('ringo'=>200, 'momo'=>300, 'banana'=>100); と設定したあと、momo を sumomo に一発修正する方法はあるのでしょうか? momo を消して sumomo 追加では順番が変わりますし、 $myArray → $myArray2 に全要素移し替えというのも多次元配列の時などは煩雑ですし・・・ 関数など、もしワンタッチでできる方法があるなら教えてください。 ないならないであきらめて地道な手順でやりたいと思います。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • 空の配列を削除して、詰めていく。

    データベースから値を取ってくるとき、全て、同じ値が入ってくる場合があります。 $a = array(100,100,100,100,100)というような。 これを、array_uniqueで重複している値を削除したのですが、その際、print_rで見ると、 Array ( [4] => 100 ) と表示されました。つまり、キーが0ではなく、4となってしまっています。 array_uniqueで帰ってきた値が複数なら、さらにsortすることで0から始まる配列として並び替えられるのですが、1つしか帰ってこないとsortをしても、キーは変わらないようです。 この値を表示させるとき、countで配列の数を数え、さらにfor文でcountの数だけ回し、print $i;で表示させるようにしているのですが、上記のようにarray_uniqueで1つの値しか帰ってこないと、ページに値がきちんと表示できなくなってしまいます。 これを解決するために、空の要素を削除して、空白でない要素のキーを前に詰めてくれるような関数などを探しているのですが、何か方法などありますでしょうか? Array ( [4] => 100 ) が Array ( [0] => 100 )となるようにしたいのです。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • 要素にnullが入った多次元配列の次元数(2回目)

    同様の質問について再度投稿します。 以下、問題集で見掛けたプログラムの抜粋です。 String[][] Array = { {"Sunday", "Monday"}, null, {"Monday", "Tuesday"} }; int count =0; for (String[] A : array){ count += A.length; } System.out.println(count); このプログラムを実行すると、 要素nullのlengthが数えられないため、 NullPointerExceptionが発生する、ということです。 以前に質問した際には、 上記配列に含まれるnullは、大カッコで囲まれていないため、 次元としてカウントされないので、配列の次元数は 2次元となる、という回答を頂きました。 (配列変数も二次元で宣言されている。) 細かいようですが、大カッコで囲まれていないnullは 次元数としてカウントされなくても、要素として 拡張for文の対象にはなるのでしょうか…? 解説をお願いします。

  • 2つの変数(文字)を組み合わせて1つの変数として認識させる方法?

    PHPの初心者チュートリアルサイトやphp manualなども見てるのですが あまりに基本的過ぎるのか、どうしてもわからないので教えてください。 $myarray1 = array("a","b","c"); $myarray2 = array("d","e","f"); $myarray3 = array("x","y","z"); という配列があるとして、 これをforループで使いたいと考えました。 例えば無理やり書くと下記のようなイメージなのですが やはりこのようなあてずっぽうではうまく行かず・・・。 for( $i = 1; $i<= 3; $i++ ){ echo {$myarray.$i}[0] . "<br/>"; } 「$myarray.$i」を$myarray1~3と認識させてa,d,xの3つを出力することはできますか?

    • 締切済み
    • PHP
  • php&html printで二次元配列が表示できない

    <html><body> <?php $array1[]= array(); //二次元配列作成 $array1[0][0] = 123; print "$array1[0][0]"; ?> </body></html> というプログラムを作成してみたのですが、printの中身がhtmlでは”一次元配列$array1[0]”と”文字列[0]”という風に読み取られているようで、 表示が Array[0] となってしまいます。 どうにか二次元配列の値を表示する方法はありませんか?

    • ベストアンサー
    • PHP
  • countで0を返せますか?

    PHP,Mysql5です。 IFNULL関数で実現できそうなことがわかり以下のようなソースで 試してみたのですが0ではなくnullが返ってきてしまいます・・・ $where_sql = join(' || ' , $where); //$where_sqlの中身 DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-01' || DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-02' || 中略・・・ DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-30' || DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-31' $sql = "SELECT create_date, IFNULL(Count(order_id), 0) as cnt FROM products_order_detail WHERE {$where_sql} GROUP BY order_id"; 例えば以下のような構成だとします。 2009-03-05のデータが1件存在 2009-03-12のデータが2件存在 2009-03-24のデータが1件存在 現状の結果は以下の通りです。 Array ( [0] => Array ( [create_date] => 2009-03-05 [cnt] => 1 ) [1] => Array ( [create_date] => 2009-03-12 [cnt] => 2 ) [2] => Array ( [create_date] => 2009-03-24 [cnt] => 2 ) 当然の結果なのですがこのように存在する分のデータのみが返って きます。希望としての結果の配列は以下のような感じで Array ( [0] => Array ( [create_date] => 2009-03-01 [cnt] => 0 ) 中略・・・ [4] => Array ( [create_date] => 2009-03-05 [cnt] => 1 ) 中略・・・ [11] => Array ( [create_date] => 2009-03-12 [cnt] => 2 ) 中略・・・ [23] => Array ( [create_date] => 2009-03-24 [cnt] => 2 ) 中略・・・ [30] => Array ( [create_date] => 2009-03-31 [cnt] => 0 ) のように比較する日付のデータがあればカウントしなければcntに nullではなく0を入れたいのですがどうすればいいでしょうか? もしくはPHPにて処理するべき事なのか方法が思いつきません。

    • 締切済み
    • PHP
  • 【PHP】配列のキーに「会員番号」を入れるのは非常識?

    PHP初心者です。 配列に関して悩んでいます。 キーに「148」等の会員番号を入れて要素に「○山○夫」等の要素を入れるとします。 ここでうっかり「array_reverse()」などを使おうものなら会員番号が付け変わってしまいめちゃくちゃになってしまいます。 このへんの問題に対してプロの方はどんな方法で対処されてるのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPに関する質問です。

    PHPに関する質問です。 データベースからfetchしたデータを 10件づつとりだしグループ化して、最後の残りが8件以下の場合は、各グループの配列の先頭に加えるという処理を行う際に、このような記述をしているのですが、 $data = array(); // 保存する配列 $ct1 = 0; $ct2 = 0; while($row = $res->fetch(PDO::FETCH_NUM)) { if ($ct2 === 10) { $ct1++; $ct2 = 0; } if ($ct2 === 0) { $data[$ct1] = array(); } $data[$ct1][] = $row; $ct2++; } if (count($data[$ct1]) < 8) { $arr = array_pop($data); $x = floor(count($arr) / count($data)); // 各要素に割り当てる数 for ($i = 0; $i < count($data); $i++) { for ($j = 0; $j < $x; $j++) { array_push($data[$i], array_pop($arr)); } } $t = 0; while (count($arr) > 0) { // 最後のあまりを先頭に追加 array_push($data[$t], array_pop($arr)); $t++; } } この処理だと、生成された配列が3次元になってしまいます。 Array ( [0] => Array ( [0] => Array ( [0] => あ ) [1] => Array ( [0] => あ) [2] => Array ( [0] => あ) [3] => Array ( [0] => あ) [4] => Array ( [0] => あ) [5] => Array ( [0] => あ ) [6] => Array ( [0] => あ ) [7] => Array ( [0] => あ) [8] => Array ( [0] => あ ) [9] => Array ( [0] => あ ) [10] => Array ( [0] => あ) ) [1] => Array ( [0] => Array ( [0] => あ) [1] => Array ( [0] => あ) [2] => Array ( [0] =>あ ) [3] => Array ( [0] => あ ) [4] => Array ( [0] => あ ) [5] => Array ( [0] => あ ) [6] => Array ( [0] => あ) [7] => Array ( [0] => あ ) [8] => Array ( [0] => あ ) [9] => Array ( [0] => あ ) [10] => Array ( [0] => あ ) ) [2] => Array ( [0] => Array ( [0] => あ ) [1] => Array ( [0] => あ) [2] => Array ( [0] => あ ) [3] => Array ( [0] => あ ) [4] => Array ( [0] => あ) [5] => Array ( [0] => あ ) [6] => Array ( [0] => あ ) [7] => Array ( [0] => あ ) [8] => Array ( [0] => あ ) [9] => Array ( [0] => あ) [10] => Array ( [0] => あ ) ) [3] => Array ( [0] => Array ( [0] => あ ) [1] => Array ( [0] => あ ) [2] => Array ( [0] => あ ) [3] => Array ( [0] => あ ) [4] => Array ( [0] => あ ) [5] => Array ( [0] => あ) [6] => Array ( [0] => あ ) [7] => Array ( [0] => あ ) [8] => Array ( [0] => あ ) [9] => Array ( [0] => あ) ) ) これを array([0]=>array(あ,あ,あ,あ,あ,あ,あ)[1]=>array(あ,あ,あ,あ,あ,あ,あ)) のように2次元で取り出すには、どのように行えばいいでしょうか。 この後の処理としては、 $key = 'a'; array_search($key,$data) のようにキーを取得したいと考えています。 宜しくお願いします。

    • 締切済み
    • PHP
  • プログラミングで困っています。

    メインメソッドで、 MyArray array = new MyArray(10); // サイズ10の配列をつくります。 を実行したとします。クラス MyArrayは配列にObjectを挿入、削除できるメソッド(add()とdelete())、+その他を追加したものです。 MyArrayクラスの中から、arrayを他のクラスに返すメソッドを作ることはできるんでしょうか?arrayの配列だけを返すのでなくて、MyArrayであるarrayそのものを返したいのですが、どうすればいいでしょうか。 理由は、他のメソッドから、arrayの配列に行われたadd()とdelete()の回数をモニターする必要があるからです。 *add()とdelete()には、呼ばれるたびに、int counterを1ずつ増やすようにしています。counterの数の変化によってarray配列が変化したかどうかモニターするわけです。