配列からキーと値を一緒に取り出す方法
普通は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); }
初めからこれを使えば良かったのだ。