こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

通常の添字か連想添字かの判別

$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')
などと指定されていた時、それは連想添字でないという
判別になってしまい、それはそれで困ります。
(今作っている機能の性質上、そんな事をする人は滅多にいないとは
思いますが)

これをどうにか綺麗に判別する方法などありますでしょうか?
それともそういうデータの受け渡しを許可している作りを
見直す、という方向になってしまうのでしょうか?

投稿日時 - 2008-07-09 15:58:36

QNo.4163301

困ってます

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

PHPでは連想配列と配列の区別はなく、
配列のインデックスと連想配列のキーの区別も無いです。
そして、連想配列のキーに「数値として解釈できる文字列」が指定された場合は
数値に変換した上でキーとして使います。

そのため、文字列'456'を文字列のままキーにすることはできません。
 $hoge = array('a', 'b');

 $hoge = array('0'=>'a', '1'=>'b');
と同じ意味です。

[参考]
PHPの配列のキーについて調べてみる - hnwの日記
http://d.hatena.ne.jp/hnw/20070521


ちなみにJavaScriptでは、数値をキーに指定すると文字列に変換されます。(キーは文字列で統一。)

投稿日時 - 2008-07-09 18:26:54

お礼

ありがとうございます。

やはり、そういうことなんですね・・・。
どうしてもしたいならハッシュマップクラスでも作れ、ってとこですか。

ちょっとだけ作りを変えて、対応しようと思います。

投稿日時 - 2008-07-09 19:14:56

ANo.3

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

is_numeric()は「数値として扱えるか確認」なので、
is_int()にしてみてはいかがでしょう?

参考URL:http://jp.php.net/manual/ja/function.is-int.php

投稿日時 - 2008-07-09 17:33:34

お礼

ありがとうございます。
そんなのがあったのか!と思いながら試してみましたが、
配列に入れた時点かどっかで、数値のみで構成
されている連想添字は数値になってしまうようです・・・。
is_int()でもtrueになっちゃいました。
ちなみにis_string()はfalseになっちゃいました。

key()でもやってみましたが、ダメでした。。

別な方法を考えた方が早いんでしょうかね・・・

投稿日時 - 2008-07-09 17:53:08

ANo.1

なにをやりたいかわかりませんが・・・

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>";

?>

投稿日時 - 2008-07-09 16:42:34

補足

これだと$a['1']='d';の添字は数値として識別されてしまいます。
質問上で記した
$hoge = array('456' => 'a', '789' => 'b')
は、あくまで連想添字で、ユーザーがそういう値を指定した、という認識をさせたいのです。

また、値の設定的に以下のような場合が存在します。
$hoge = array('a', '789' => 'b')

連想添字を有しないものは添字を利用しないでデータを加工、
連想添字を有するものは添字を利用してデータを加工しています。
しかし、上記のような数値のみで連想添字が構成されてしまうと、
それが連想添字なのか自動付番されたインデックスなのかの
区別がつかない為、データ加工で問題が生じてしまうのです。
(ユーザーからの正規入力を受け付けなかったデータ加工となる)

相当おかしなユーザーでない限り、そういった連想添字が構成される
パターンはないとは思います。(機能的に)
また、添字を利用しないでデータを加工されたとしても大して
支障はありません。
しかし、入力された値が存在する以上、プログラムで対処できるの
ならばやりたいのです。

投稿日時 - 2008-07-09 17:27:49

あなたにオススメの質問