foreach($array as $key => $array)
$array が繰り返す配列かつ要素の値の場合です。
Githubのどこかで見つけて、IDEがエラーでなく警告判定していたのでへーと思いました。
でもどんな動きになるのかわからないので動かしてみた。
結論
繰り返し中、繰り返し後に元々の配列'$array'を使用しないならば問題なし。($array[]や$array[$key]は危ない)
逆に使っているならば結果がおかしいとすぐに分かると思う。
foreach($array as $key => $array)
foreach1,php
$array = array('A' => 'a', 'B' => 100, 'C' => true);
foreach ($array as $key => $array) {
echo "key: " . $key . " array: " . $array . "\n";
echo "array[key]: " . $array[$key] . "\n";
var_dump($array);
}
var_dump($array);
key: A array: a
array[key]: a
string(1) "a"
key: B array: 100
array[key]:
int(100)
key: C array: 1 # true は出力で1
array[key]:
bool(true)
bool(true)
-
foreachは回る -
$keyでの参照はエラー自体は無し。(aはstringの添字参照で出たと思う) -
$arrayはforeach内ですでに要素の値に置き換わっており、ループを抜けても最後の要素のまま
foreach($array as $array)
foreach2,php
$array = array('A' => 'a', 'B' => 100, 'C' => true);
foreach ($array as $array) {
echo "array: " . $array . "\n";
var_dump($array);
}
var_dump($array);
array: a
string(1) "a"
array: 100
int(100)
array: 1
bool(true)
bool(true)
こちらも元々の$arrayが壊れる以外は問題無し。
やる意味は特になかったか。
foreach($array as $key => $array) かつ数値配列
普通の配列の場合(まだ全部連想配列なんですが)
foreach3.php
$array = array('a', 100, true);
foreach ($array as $key => $array) {
echo "key: " . $key . " array: " . $array . "\n";
echo "array[key]: " . $array[$key] . "\n";
var_dump($array);
}
var_dump($array);
key: 0 array: a
array[key]: a
string(1) "a"
key: 1 array: 100
array[key]:
int(100)
key: 2 array: 1
array[key]:
bool(true)
bool(true)
まぁ問題なし。
foreach($array as $key => $array) かつ数値配列で値がstring
の時点でstringの添字参照は危なそうと思った。
foreach4.php
$array = array('a', 'b', 'c');
foreach ($array as $key => $array) {
echo "key: " . $key . " array: " . $array . "\n";
echo "array[key]: " . $array[$key] . "\n";
var_dump($array);
}
var_dump($array);
key: 0 array: a
array[key]: a
string(1) "a"
key: 1 array: b
PHP Notice: Uninitialized string offset: 1 in /tmp/foreach4.php on line 47
array[key]:
string(1) "b"
key: 2 array: c
PHP Notice: Uninitialized string offset: 2 in /tmp/foreach4.php on line 47
array[key]:
string(1) "c"
string(1) "c"
やったぜ。
「添字 + 1 > 要素の文字数」 の場合はoffsetでエラーになりそう。