Perl入門 ≫ LESSON6 ハッシュ

ハッシュの基本

配列は添え字の数字ごとにリストとしてデータが並んでいますが、ハッシュ(連想配列)は添え字の代わりに何かKEYとなる数字や文字と、それと対になる値で編成されます。

例えば

名前パスワード
user1pass1
user2pass2
user3pass3

こんなような組み合わせのデータがあります。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'とその値が削除されました。

多次元ハッシュ

ハッシュの中にハッシュを定義してみましょう。

$hensu = array(
  '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'が入っていることになります。



ページのトップへ戻る