3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

foreach($array as $key => $array) 時の動作

Last updated at Posted at 2015-08-05

foreach($array as $key => $array)
$array が繰り返す配列かつ要素の値の場合です。

Githubのどこかで見つけて、IDEがエラーでなく警告判定していたのでへーと思いました。

でもどんな動きになるのかわからないので動かしてみた。

結論

繰り返し中、繰り返し後に元々の配列'$array'を使用しないならば問題なし。($array[]$array[$key]は危ない)
逆に使っているならば結果がおかしいとすぐに分かると思う。

:one: 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の添字参照で出たと思う)
  • $arrayforeach内ですでに要素の値に置き換わっており、ループを抜けても最後の要素のまま

:two: 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が壊れる以外は問題無し。
やる意味は特になかったか。

:three: 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)

まぁ問題なし。

:four: foreach($array as $key => $array) かつ数値配列で値がstring

:one: の時点で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でエラーになりそう。

3
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?