忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

PHP 配列(array)の使い方について(「添字配列」「連想配列」)


今回はPHPのプログラムでは必ず使用するであろうデータ形式である 配列(array) について説明したいと思います。
配列(array) とは1個の変数の中に キー とそれに対応する の組み合わせを複数持っているデータ構造です(リスト構造)。
この の中に各種のデータ型を格納できます。別の配列を格納することで配列の入れ子ができます。

そもそも 配列(array) は何に使うのでしょうか?
配列の中に入れるデータはそれらが関連したデータで、ひとかたまりとして処理できるものです。
例えば以下の様な用途で使ってきました。


プログラムで処理するために繰り返し処理に向いているデータを配列として格納し、 各種の処理を行うことが配列を使う理由になります。

通常プログラム言語の「配列」は キー(添字) が数値(インデックス)である「添字配列」と、キー(添字) を文字列とする「連想配列」の2種類があります。

PHP では「添字配列」と「連想配列」の間に違いはなく、配列型は 1 つだけで、 同じ配列で整数のインデックスと文字列のインデックスを同時に使えます。

これは「添字配列」として使っていた配列が、組み方によっては「連想配列」が混在する様なことにもなりますので、注意が必要です。

インデックスを数値のみとして扱えば「添字配列」として処理でき、インデックスを文字列(数値も含む)で処理すれば「連想配列」として 処理できると考えられます。 (PHPの内部ではインデックスと値の組み合わせの「連想配列」として処理される)

【配列の構文:array()で指定】

$var = array(
    key1 => value1,
    key2 => value2,
    key3 => value3,
    ...
);

・$var  :配列を格納する変数。
・keyX  :キー値(数値でも文字列でもOK)
・valueX:要素値(各種のデータで配列もOK)


それでは「添字配列」と「連想配列」の宣言例から使い方の説明を行います。




添字配列 の宣言例

「添字配列」として宣言するには array() の中でキー値の指定を省いて、要素値のみ連続して記述します。
以下のソースでは要素が数値のみの配列、要素が文字列のみの配列、要素が数値,文字列が混在の配列を定義しています。
それぞれを宣言した変数の内容を表示するために var_dump() 関数で処理します。 尚、 var_dump() 出力の前後を <pre> タグで囲むことで、 <br> タグ無しで改行出力をブラウザで改行した様にみられます。

<?php
// 要素が数値のみの配列
$arr1 = array(10, 20, 30);
// 要素が文字列のみの配列
$arr2 = array("10", "20", "30");
// 要素が数値,文字列が混在の配列
$arr3 = array("10", 20, "30");

echo "<pre>";
var_dump($arr1);
var_dump($arr2);
var_dump($arr3);
echo "</pre>";
?>

これを実行するとブラウザに以下の様に表示されます。

array(3) {
  [0]=>
  int(10)
  [1]=>
  int(20)
  [2]=>
  int(30)
}
array(3) {
  [0]=>
  string(2) "10"
  [1]=>
  string(2) "20"
  [2]=>
  string(2) "30"
}
array(3) {
  [0]=>
  string(2) "10"
  [1]=>
  int(20)
  [2]=>
  string(2) "30"
}
【var_dump の配列の出力形式】
array(n) {
  [i]=>
  int(d)
    ...
  [j]=>
  string(c) "contents"
    ...
}
・array(n)  :arrayで配列を示す(n:配列の要素数)
・[i], [j]  :キー値(指標)
・int(d)    :数値データ  (d:要素値)
・string(c) :文字列データ(c:文字列数)
・"contents":文字列の値


添字配列 の使い方の例

以下の例はよくある配列の反復処理です。 配列の指標を使って「0」から配列の最後の指標までをループで配列の内容を表示処理しています。

この例は必ず指標は「0」から始まり、指標の最後は「配列の要素数-1」であるのが前提です。
(尚、「配列の要素数」を取得するために count() 関数を使用します。)
しかし、この前提が違っているとプログラム実行でエラーが発生しますので、後からこれを回避する方法を記します。

<?php
// 要素が数値のみの配列
$arr1 = array(10, 20, 30);
// 指標を使って「0」から「配列の大きさ-1」までを反復処理
for($i = 0; $i < count($arr1); $i++) {
    echo "\$arr1[".$i."]=".$arr1[$i]."<br />\n";
}
?>

これを実行するとブラウザに以下の様に表示されます。

$arr1[0]=10
$arr1[1]=20
$arr1[2]=30



添字配列 の使い方の例その2(foreach文)

配列を反復処理するため前述の for文 とは別の foreach文 があります。構文は以下の通りです。

【foreach文の構文】
foreach (array_expression as $value)
    文;
foreach (array_expression as $key => $value)
    文;
・array_expression:配列(指定された配列の反復処理を行う)
・$value          :配列の要素
・$key            :指標(キー値)

array_expression で指定した配列に 関して反復処理を行います。 配列に格納されている要素の値を先頭から $value に代入し、 配列の中身を指し示すポインタを先頭に設定し $value に代入します。この時ポインタが次の要素を示す様に一つ進められます。 これを順次処理することで、配列の要素を順次取得できます。

尚、2番目の形式は、さらに各反復で現在の要素のキーを変数 $key に代入します。

<?php
// 要素が数値のみの配列
$arr1 = array(10, 20, 30);
// 配列の内容を順次取得する「foreach」を使って反復処理
foreach($arr1 as $i => $value) {
    echo "\$arr1[".$i."]=".$value."<br />\n";
}
?>

これを実行するとブラウザに上記の様に表示されます。(ここでは表示割愛)
尚、指標の取得が必要無ければ「$i =>」の部分を記述しなくてもOKです。

<?php
// 要素が数値のみの配列
$arr1 = array(10, 20, 30);
// 「foreach」で指標の取得無し
foreach($arr1 as $value) {
    echo "DATA=".$value."<br />\n";
}
?>



添字配列 の使い方の例その3(foreach文の注意

配列を反復処理で要素を変更したい場合には $value の前に &(アンドマーク) を記述します。
&(アンドマーク) を付加することで反復処理での $value には配列の要素のリファレンス(参照:C言語のポインタの様なもの)が渡されます。

<?php
// 要素が数値のみの配列
$arr1 = array(10, 20, 30);
// 配列の内容を順次取得する「foreach」を使ってループ処理
foreach($arr1 as &$value) {
    $value = $value * 10;	// 要素を10倍する
}
unset($value);    // 最後の要素への参照を解除します

echo "<pre>";
print_r($arr1);
echo "</pre>";
?>

これを実行するとブラウザに以下の様に表示されます。配列の各要素が10倍されていることが分かります。

Array
(
    [0] => 100
    [1] => 200
    [2] => 300
)

ここで注意が必要なのは unset($value); です。 ここで変数 $value を破棄しないと $value には $arr1 の3番目の要素 $arr1[2] への参照が残ったままで、 不用意に $value に値を設定したりすると $arr1[2] が書き変ってしまいます。

添字配列 の使い方の例その4(角括弧構文で作成・修正)

配列に対して角括弧構文でキーを指定し要素値を設定することで、配列の更新をすることが出来ます。
キーを指定が無い場合は、指標の中で最大値の次の値を指標として値が追加されます。

<?php
// 要素が数値のみの配列
$arr1 = array(10, 20, 30);
// 角括弧構文でキーを指定し配列の要素を更新
$arr1[2] = 100;
// 角括弧構文でキー指定無しで配列の要素を追加
$arr1[] = 200;
echo "<pre>";
print_r($arr1);
echo "</pre>";
?>

これを実行するとブラウザに以下の様に表示されます。
配列の3番目の要素が「100」に更新され、4番目の要素として「200」が追加されます。

Array
(
    [0] => 10
    [1] => 20
    [2] => 100
    [3] => 200
)

尚、以下の様に角括弧構文のみで配列を作成することが出来ます。
最初の $arr1[] = で $arr1 が存在していなければ配列として生成され、キー「0」の要素に値が設定されます。
array() 宣言をコメントで消していますが、これがあれば明示的に配列だと宣言できます。(少し冗長なのですが、私はこちらを推奨します。)

<?php
// 配列宣言
//$arr1 = array();
// 角括弧構文でキー指定無しで配列の要素を追加
$arr1[] = 10;
$arr1[] = 20;
$arr1[] = 30;

echo "<pre>";
print_r($arr1);
echo "</pre>";
?>



連想配列 の宣言例

今までの 添字配列 ではキー値としていわゆるインデックスとしての数値でしたが、連想配列 としてはキー値に文字列等を用います。
宣言の最初はキーを文字列で行っていますが、最後は数値で宣言しています。

<?php
// 配列宣言
$arr1 = array(
    "KEY1" => "11111",
    "KEY2" => "222",
    "KEY3" => "3333",
    "KEY4" => "44444",
	0      => 100,		// キー:数値!!
    "KEY5" => "555",
);

echo "<pre>";
print_r($arr1);
echo "</pre>";
?>

これを実行するとブラウザに以下の様に表示されます。キーが文字列であっても数値であっても、ちゃんと配列が生成されています。 宣言の中で最後の行でカンマを記述していますが、カンマ無しでもOKです。

Array
(
    [KEY1] => 11111
    [KEY2] => 222
    [KEY3] => 3333
    [KEY4] => 44444
    [0] => 100
    [KEY5] => 555
)


連想配列 の使い方の例その1(foreach文)

添字配列 の時の様に foreach文 を使った例を示します。

<?php
// 配列宣言
$arr1 = array(
    "KEY1" => "11111",
    "KEY2" => "222",
    "KEY3" => "3333",
    "KEY4" => "44444",
	0      => 100,
    "KEY5" => "555",
);
// 配列の内容を順次取得する「foreach」を使ってループ処理
foreach($arr1 as $key => $value) {
    echo "\$arr1[".$key."]=".$value."<br />\n";
}
?>

これを実行するとブラウザに以下の様に表示されます。

$arr1[KEY1]=11111
$arr1[KEY2]=222
$arr1[KEY3]=3333
$arr1[KEY4]=44444
$arr1[0]=100
$arr1[KEY5]=555


連想配列 の使い方の例その2(foreach文の注意

添字配列のところで説明しましたが、連想配列でも配列を反復処理で要素を変更したい場合には $value の前に &(アンドマーク) を記述します。 (PHPの配列は連想配列として考えればどちらもおなじことですが)
&(アンドマーク) を付加することで反復処理での $value には配列の要素のリファレンス(参照:C言語のポインタの様なもの)が渡されます。
<?php
// 要素が数値のみの配列
$arr1 = array(
    "KEY1" => "11111",
    "KEY2" => "222",
    "KEY3" => "3333",
    "KEY4" => "44444",
	0      => 100,
    "KEY5" => "555",
);
// 配列の内容を順次取得する「foreach」を使ってループ処理
foreach($arr1 as &$value) {
    $value = $value . "AA";	// 要素に文字列 "AA" 付加
}
unset($value);    // 最後の要素への参照を解除します

echo "<pre>";
print_r($arr1);
echo "</pre>";
?>
これを実行するとブラウザに以下の様に表示されます。配列の各要素文字列 "AA" 付加されていることが分かります。
指標「0」の要素は数値でしたが、文字列との連結では数値が文字列 "100" に強制的に変換されて "AA" が付加されることになります。
array(6) {
  ["KEY1"]=>
  string(7) "11111AA"
  ["KEY2"]=>
  string(5) "222AA"
  ["KEY3"]=>
  string(6) "3333AA"
  ["KEY4"]=>
  string(7) "44444AA"
  [0]=>
  string(5) "100AA"
  ["KEY5"]=>
  string(5) "555AA"
}
ここで注意が必要なのは unset($value); です。 ここで変数 $value を破棄しないと $value には $arr1 の3番目の要素 $arr1["KEY5"] への参照が残ったままで、 不用意に $value に値を設定したりすると $arr1["KEY5"] が書き変ってしまいます。

連想配列 の使い方の例その3(角括弧構文で作成・修正)

配列に対して角括弧構文でキーを指定し要素値を設定することで、配列の更新をすることが出来ます。
キーを指定が無い場合は、指標の中で最大値の次の値を指標として値が追加されます。
<?php
// 配列宣言
$arr1 = array();
// 角括弧構文でキー指定で配列の要素を追加
$arr1["KEY1"] = "11111";
$arr1["KEY2"] = "222";
$arr1["KEY3"] = "3333";
$arr1["KEY4"] = "44444";
$arr1[0     ] = 100;
$arr1["KEY5"] = "555";
// 配列内部表示
echo "<pre>最初の表示<br>";
var_dump($arr1);
echo "</pre>";

// キー指定無しで追加
$arr1[] = 200;
// 配列内部表示
echo "<pre>追加後の表示<br>";
var_dump($arr1);
echo "</pre>";
?>
これを実行するとブラウザに以下の様に表示されます。
キー指定無しでの配列への追加は、キーの中で数値の最大値に+1されたものがキーとなりその要素に値が設定されます。 (数値キーがなければキーは「0」となります。)
最初の表示
array(6) {
  ["KEY1"]=>
  string(5) "11111"
  ["KEY2"]=>
  string(3) "222"
  ["KEY3"]=>
  string(4) "3333"
  ["KEY4"]=>
  string(5) "44444"
  [0]=>
  int(100)
  ["KEY5"]=>
  string(3) "555"
}

追加後の表示
array(7) {
  ["KEY1"]=>
  string(5) "11111"
  ["KEY2"]=>
  string(3) "222"
  ["KEY3"]=>
  string(4) "3333"
  ["KEY4"]=>
  string(5) "44444"
  [0]=>
  int(100)
  ["KEY5"]=>
  string(3) "555"
  [1]=>
  int(200)
}











PR

コメント

コメントを書く