連想配列

2018-08-19 10:57:22

PHPで文字列をキーにした配列を連想配列と呼ぶことが多いが、この呼び方は正しくない

正確には文字列添え字配列である

もともとPHPの配列は添え字とデータを対応づけるマップの構造であるため、実質的に数値添え字添え字と、内部的な動作は変わりは無い

基本的な使い方

2018-08-20 14:43:05

Test21.php

<!DOCTYPE html>
<HTML lang="ja">
    <HEAD>
        <META charset="UTF-8" />
        <TITLE>PHPテストプログラム</TITLE>
    </HEAD>
    <BODY>
<?php
$a["SCHNECKEN"] = "シュネッケン";
$a["DEATH SAUCE"] = "デスソース";
$a["SALMIAKKI"] = "サルミアッキ";
 
echo "$a[SCHNECKEN]<br>\n";
echo "{$a['DEATH SAUCE']}<br>\n";
echo "$a[SALMIAKKI]<br>\n";
echo "<br>\n";
//foreachで要素数分だけループ
foreach ($a as $v) {
    echo "$v<br>\n";
}
echo "<br>\n";
//foreachで要素数分だけループ(要素番号を取り出す)
foreach ($a as $i => $v) {
    echo "$i:$v<br>\n";
}
?>
    </BODY>
</HTML>

実行結果
シュネッケン
デスソース
サルミアッキ
 
シュネッケン
デスソース
サルミアッキ
 
SCHNECKEN:シュネッケン
DEATH SAUCE:デスソース
SALMIAKKI:サルミアッキ


文字列中で文字列添え字配列を使う場合は、ダブルクオートやシングルクオートは省略する
しかし添え字にスペースが含まれているときはその限りではない
{}で囲った上で、シングルクオートで囲む必要がある
私もここの項目の記事を書きながら、初めて知った事実である

配列の初期化

2018-08-20 15:07:34

Test22.php

<!DOCTYPE html>
<HTML lang="ja">
    <HEAD>
        <META charset="UTF-8" />
        <TITLE>PHPテストプログラム</TITLE>
    </HEAD>
    <BODY>
<?php
$a = array("SCHNECKEN" => "シュネッケン", "DEATH SAUCE" => "デスソース", "SALMIAKKI" => "サルミアッキ");
$b = ["SCHNECKEN" => "シュネッケン", "DEATH SAUCE" => "デスソース", "SALMIAKKI" => "サルミアッキ"];
//foreachで要素数分だけループ(要素番号を取り出す)
foreach ($a as $i => $v) {
    echo "$i:$v<br>\n";
}
echo "<br>\n";
foreach ($b as $i => $v) {
    echo "$i:$v<br>\n";
}
?>
    </BODY>
</HTML>

実行結果
SCHNECKEN:シュネッケン
DEATH SAUCE:デスソース
SALMIAKKI:サルミアッキ
 
SCHNECKEN:シュネッケン
DEATH SAUCE:デスソース
SALMIAKKI:サルミアッキ


添え字の扱いに関して

2018-08-20 15:11:43

Test23.php

<!DOCTYPE html>
<HTML lang="ja">
    <HEAD>
        <META charset="UTF-8" />
        <TITLE>PHPテストプログラム</TITLE>
    </HEAD>
    <BODY>
<?php
$a[0] = "あいうえお";
$a["0"] = "かきくけこ";
echo $a[0]. "<br>\n";
echo $a["0"]. "<br>\n";
echo "<br>\n";
$a[00] = "あいうえお";
$a["00"] = "かきくけこ";
echo $a[00] . "<br>\n";
echo $a["00"] . "<br>\n";
echo "<br>\n";
?>
    </BODY>
</HTML>

実行結果
かきくけこ
かきくけこ
あいうえお
かきくけこ

添え字において、数値と文字列は同じ扱いを受ける
ただし無駄な数値表現は丸められるので、そこが文字列を使った場合との相違点だ

添え字の型

2018-08-20 15:21:50

Test24.php

<!DOCTYPE html>
<HTML lang="ja">
    <HEAD>
        <META charset="UTF-8" />
        <TITLE>PHPテストプログラム</TITLE>
    </HEAD>
    <BODY>
<?php
$a = array("シュネッケン", "デスソース", "サルミアッキ");
 
foreach($a as $i => $v){
    echo gettype($i)." $i:$v<br>\n";
}
echo "<br>\n";
$a = array("0"=>"シュネッケン", "1" => "デスソース", "2" => "サルミアッキ");
foreach ($a as $i => $v) {
    echo gettype($i) . " $i:$v<br>\n";
}
echo "<br>\n";
$a = array("00" => "シュネッケン", "01" => "デスソース", "02" => "サルミアッキ");
foreach ($a as $i => $v) {
    echo gettype($i) . " $i:$v<br>\n";
}
echo "<br>\n";
?>
    </BODY>
</HTML>

実行結果
integer 0:シュネッケン
integer 1:デスソース
integer 2:サルミアッキ
 
integer 0:シュネッケン
integer 1:デスソース
integer 2:サルミアッキ
 
string 00:シュネッケン
string 01:デスソース
string 02:サルミアッキ

これはやっかいな変換規則である
過剰装飾されている数字は文字列型添え字となる
演算子===系でバグを引き起こす原因となり得るので注意が必要だ