- ベストアンサー
通常の添字か連想添字かの判別
$hoge = array('a', 'b'); の場合、 array([0] => 'a', [1] => 'b') となり、 $hoge = array('abc' => 'a', 'def' => 'b') の場合、 array(['abc'] => 'a', ['def'] => 'b') という格納結果になると思いますが、 ここでその格納されている配列の添字がインデックスなのか 連想添字なのかの判別をしたいです。 添字をis_numeric()で判別しようかと思いましたが、 $hoge = array('456' => 'a', '789' => 'b') などと指定されていた時、それは連想添字でないという 判別になってしまい、それはそれで困ります。 (今作っている機能の性質上、そんな事をする人は滅多にいないとは 思いますが) これをどうにか綺麗に判別する方法などありますでしょうか? それともそういうデータの受け渡しを許可している作りを 見直す、という方向になってしまうのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
PHPでは連想配列と配列の区別はなく、 配列のインデックスと連想配列のキーの区別も無いです。 そして、連想配列のキーに「数値として解釈できる文字列」が指定された場合は 数値に変換した上でキーとして使います。 そのため、文字列'456'を文字列のままキーにすることはできません。 $hoge = array('a', 'b'); も $hoge = array('0'=>'a', '1'=>'b'); と同じ意味です。 [参考] PHPの配列のキーについて調べてみる - hnwの日記 http://d.hatena.ne.jp/hnw/20070521 ちなみにJavaScriptでは、数値をキーに指定すると文字列に変換されます。(キーは文字列で統一。)
その他の回答 (2)
- Shin417
- ベストアンサー率64% (9/14)
is_numeric()は「数値として扱えるか確認」なので、 is_int()にしてみてはいかがでしょう?
お礼
ありがとうございます。 そんなのがあったのか!と思いながら試してみましたが、 配列に入れた時点かどっかで、数値のみで構成 されている連想添字は数値になってしまうようです・・・。 is_int()でもtrueになっちゃいました。 ちなみにis_string()はfalseになっちゃいました。 key()でもやってみましたが、ダメでした。。 別な方法を考えた方が早いんでしょうかね・・・
- yambejp
- ベストアンサー率51% (3827/7415)
なにをやりたいかわかりませんが・・・ PHPの場合、添字に数字を指定すると、文字列には認識されませんね。 たとえば・・・ <? $a=array(); $a[]='a';//0にaがはいり $a[]='b';//1にbがはいる $a[0]='c';//数値で指定しても $a['1']='d';//文字列で指定しても、結局数値として上書きされる $a['x']='y';//ダミー foreach($a as $key=>$val){ print $key.":".(is_numeric($key)?"数値":"数値ぢゃない")."<br>"; //is_numeric()でみれば数値になっているようです } print_r( $a); print "</pre>"; ?>
補足
これだと$a['1']='d';の添字は数値として識別されてしまいます。 質問上で記した $hoge = array('456' => 'a', '789' => 'b') は、あくまで連想添字で、ユーザーがそういう値を指定した、という認識をさせたいのです。 また、値の設定的に以下のような場合が存在します。 $hoge = array('a', '789' => 'b') 連想添字を有しないものは添字を利用しないでデータを加工、 連想添字を有するものは添字を利用してデータを加工しています。 しかし、上記のような数値のみで連想添字が構成されてしまうと、 それが連想添字なのか自動付番されたインデックスなのかの 区別がつかない為、データ加工で問題が生じてしまうのです。 (ユーザーからの正規入力を受け付けなかったデータ加工となる) 相当おかしなユーザーでない限り、そういった連想添字が構成される パターンはないとは思います。(機能的に) また、添字を利用しないでデータを加工されたとしても大して 支障はありません。 しかし、入力された値が存在する以上、プログラムで対処できるの ならばやりたいのです。
お礼
ありがとうございます。 やはり、そういうことなんですね・・・。 どうしてもしたいならハッシュマップクラスでも作れ、ってとこですか。 ちょっとだけ作りを変えて、対応しようと思います。