Perl入門 ≫ LESSON6 ハッシュ
ハッシュの基本
配列は添え字の数字ごとにリストとしてデータが並んでいますが、ハッシュ(連想配列)は添え字の代わりに何かKEYとなる数字や文字と、それと対になる値で編成されます。
例えば
名前 | パスワード |
---|---|
user1 | pass1 |
user2 | pass2 |
user3 | pass3 |
こんなような組み合わせのデータがあります。3人の名前とパスワードの対です。
名前のデータは重複することはありません。
これをハッシュであらわすと次の様になります。
$hensu = array('user1'=>'pass1',
'user2'=>'pass2',
'user3'=>'pass3')
ハッシュ変数は、$に続いて変数名を付けて表します。
KEYとその値を=>で繋いで宣言します。
最初の2つの場合、KEYが'user1'、その値が'pass1'となります。
あとの二つも同様。
KEYとなる名前を指定すれば、その値(この場合パスワード)を直ちに取り出すことができます。
値を参照してみましょう。
$変数名[KEY]
で値を参照・代入することができます。
$hensu = array('user1'=>'pass1','user2'=>'pass2','user3'=>'pass3');
echo "key 'user1' data = " . $hensu['user1'] . "\n";
echo "key 'user2' data = " . $hensu['user2'] . "\n";
echo "key 'user3' data = " . $hensu['user3'] . "\n";
結果は以下。
key 'user1' data = pass1
key 'user2' data = pass2
key 'user3' data = pass3
よって、KEYはハッシュの中で一意でなくてはなりません。
ようするに、同じ名前のKEYを複数作ってはいけないということです。というか、作ろうとしても作れません。すでにあるKEYの値として上書きされます。
各KEYの値(VALUE)は同じでもかまいません。
値を入れたり、新しく作ったりしてみましょう。
途中で値を代入する場合、普通に「=」でOKです。「=>」は宣言時だけです。
$hensu = array('user1'=>'pass1','user2'=>'pass2','user3'=>'pass3');
echo "key 'user1' data = " . $hensu['user1'] . "\n";
echo "key 'user2' data = " . $hensu['user2'] . "\n";
echo "key 'user3' data = " . $hensu['user3'] . "\n";
$hensu['user2'] = 'pass2_1';
#KEY'user2'の値を変更します。
echo "key 'user2' data = " . $hensu['user2'] . "\n\n";
$hensu['user5'] = 'pass5';
#KEY'user5'の値を追加します。
echo "key 'user5' data = " . $hensu['user5'] . "\n";
結果は以下。
key 'user1' data = pass1
key 'user2' data = pass2
key 'user3' data = pass3
key 'user2' data = pass2_1
key 'user5' data = pass5
ここで、キーを指定せずにデータを追加してみます。
$hensu = array('user1'=>'pass1','user2'=>'pass2','user3'=>'pass3');
$hensu[] = 'abc';
$hensu[] = 'def';
var_dump($hensu);
結果はこうなります
array(5) {
["user1"]=>
string(5) "pass1"
["user2"]=>
string(5) "pass2"
["user3"]=>
string(5) "pass3"
[0]=>
string(3) "abc"
[1]=>
string(3) "def"
}
キーを指定しなかったら添え字0のデータとして追加されました。
PHPでは、添え字を使う配列と、キーを使うハッシュはおなじものとして扱われるようです。
不思議言語です。
しかも、この場合追加した$hensu[0]は、$hensu['0']としても同じになります。
$hensu[0+'1']とやってみたら$hensu[1]の値が出ました。
ますます不思議言語。
KEYとVALUE
KEYとVALUEを取り出すにはどうしたらいいでしょう。
取り出したKEYもVALUEも複数ありえますから、配列になっています。
$hensu = array('user1'=>'pass1','user2'=>'pass2','user3'=>'pass3');
$key = array_keys($hensu);
#KEYを取り出します。
$value = array_values($hensu);
#VALUEを取り出します。
var_dump($key);
var_dump($value);
結果は以下。
array(3) {
[0]=>
string(5) "user1"
[1]=>
string(5) "user2"
[2]=>
string(5) "user3"
}
array(3) {
[0]=>
string(5) "pass1"
[1]=>
string(5) "pass2"
[2]=>
string(5) "pass3"
}
KEYとVALUEをそれぞれ配列に取り出せました。
削除
ハッシュのデータを削除してみましょう。
値を削除する時は""でも代入しておけばいいのですが、一度作ってしまったKEYを削除するにはどうしたらいいでしょうか?
削除にはundefを使います。
$hensu = array('user1'=>'pass1','user2'=>'pass2','user3'=>'pass3');
unset($hensu['user3']);
var_dump($hensu);
結果は以下。
array(2) {
["user1"]=>
string(5) "pass1"
["user2"]=>
string(5) "pass2"
}
KEY'user3'とその値が削除されました。
多次元ハッシュ
ハッシュの中にハッシュを定義してみましょう。
'name1'=>array('age'=>20, 'address'=>'tokyo'),
'name2'=>array('age'=>21, 'address'=>'kanagawa')
);
var_dump($hensu);
出力してみます。
array(2) {
["name1"]=>
array(2) {
["age"]=>
int(20)
["address"]=>
string(5) "tokyo"
}
["name2"]=>
array(2) {
["age"]=>
int(21)
["address"]=>
string(8) "kanagawa"
}
}
こうなります。
$hensu['name1']の中にさらにハッシュが入っています。配列のところでやった多次元配列のハッシュ版です。
各値は、$hensu['name1']['age']や$hensu['name2']['address']と書きます。[]が複数ありますが、前から順に一番外側のハッシュのKEYとなります。

こういうことですね。
echo $hensu['name1']['age'];
とすると、20が出力されます。
もちろん追加、値変更も同じように添え字を複数指定すればできます。
$hensu['name1']['zip'] = '000-0001';
こうすれば、$hensu['name1']の中身は追加されてarray('age'=>20, 'address'=>'tokyo', 'zip'=>'000-0001')となります。
すべての要素は全部同じ個数である必要はないので、自由な形のデータを作る事ができます。
もちろん、配列の中にハッシュを作ったり、ハッシュの中に配列を作ることもできます。
ハッシュのリファレンス
ハッシュへのリファレンスを作ってみます。
$hensu = array('user1'=>'pass1','user2'=>'pass2','user3'=>'pass3');
$hensu1 = &$hensu;
echo $hensu1['user1'];
結果は以下。
pass1
おなじものを指す別名、と思えばわかりやすいです。
$hensu1['user1'] = 'pass0';
と値を変更したら、$hensu1['user1']も$hensu['user1']も同じ'pass0'が入っていることになります。