FALSEを信用してはならない

配列からキーと値を一緒に取り出す方法

普通はforeachを使うのだが、

<?php
foreach( $array as $val ){
   calc($val);
}

とするのだが、これでは値しか取り出せない。そこで、以下のようなものを思いついた。

<?php
reset( $array );
do{
   calc( current($array) , key($array) );
}while( next($array) );

phpでは、配列上でポインタを転がしたい時、配列の内部ポインタを使う。current($array)は内部ポインタの指す値を返し、key($array)は内部ポインタの指すキーを返す。resetは内部ポインタを先頭に戻し、nextは内部ポインタを先に進める。

これで一件良さそうに見えるが、next($array)の返値はTRUEorFALSEではないと言う点がくせ者だ。もちろん内部ポインタを先に進めることができない時はFALSEを返すが、基本は今の内部ポインタの指す値を返し、内部ポインタを一つ進める、という命令である。++iみたいな感じだ。

ここで問題だったのが、その内部ポインタの指す値が、NULLや、""(空の文字列)や、数値0だった時だ。phpでは、以下の3つでTRUEが返る。

<?php
if( "" == FALSE )echo('空の文字列は偽と等しい'):
if( NULL == FALSE )echo('NULLは偽と等しい'):
if( 0 == FALSE )echo('0は偽と等しい'):

なんとなく、0とFALSEが等しいのはC言語に慣れ親しんでいると分かるが、NULLと""までFALSEと等しいというのは変な感じがする。よって、phpでは、こうすると、全部TRUEが返らない。

<?php
if( "" === FALSE )echo('空の文字列は偽と等しいはずがない');
if( NULL === FALSE )echo('NULLは偽と等しいはずがない');
if( 0 === FALSE )echo('0は偽と等しいはずがない');

「===」とイコールを三つ続けると、型まで等しいかを検証するようになる。これで、使える。よって、

<?php
<?php
reset( $array );
do{
   calc( current($array) , key($array) );
}while( FALSE === next($array) );

とすれば、配列の中にFALSEが入っていない限り有効になる。用途としては、ブラウザから送られてきたPOSTやGETを解読する時に使う感じだろうか。

foreachの拡張型を使えば一発

後で調べて分かったのだが、foreachはキーの値も得ることができるらしい。

<?php
foreach( $array as $key => $val ){
   calc($val,$key);
}

初めからこれを使えば良かったのだ。