質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

570閲覧

array_pushにおける配列の挙動について

auto_miss56

総合スコア24

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/03/15 13:20

編集2020/03/15 15:01

二つの配列を作り、出力するプログラムを作りたいと考えています

php

1$left = [""]; 2for ($i = 1; $i < 5; $i++){ 3array_push($left, $i); 4} 5 6$right = [""]; 7for ($i = 1; $i < 10; $i +=2){ 8array_push($right, $i); 9} 10 11for ($i = 0; $i < 5; $i++){ 12 echo $i."番目 "; 13 echo $left[$i]; 14 echo $right[$i]; 15 echo "\n"; 16}

出力結果

0番目 1番目 11 2番目 23 3番目 35 4番目 47

冒頭のコード一行目を

php

1$left = [];

に変えると

PHP Notice: Undefined offset: 4 in /workspace/Main.php on line 14

が出力されます
ですが
冒頭のコード7行目を

$right = [];

に変え(一行目は「 $left = [] 」 から 「 $left = [""] 」に戻して)出力すると、出力結果は

0番目 1 1番目 13 2番目 25 3番目 37 4番目 49

となり、無理やり出力しようとします
配列 $left と $right は内部構造的にどのような違いがあるのでしょうか?
ご存じの方ご教示していただけると幸いです。

ちなみに

php

1$right = []; 2for ($i = 1; $i < 10; $i +=2){ 3array_push($right, $i); 4} 5 6for ($i = 0; $i < 5; $i++){ 7 echo $i."番目 "; 8 echo $right[$i]; 9 echo "\n"; 10}

はエラーにならず
出力結果は

0番目 1 1番目 3 2番目 5 3番目 7 4番目 9

となります
(二行目の「 $i += 2 」を 「 $i++ 」に変えると 通常の連番出力)

実行環境はpaiza.ioのphpのオンライン実行環境です
paiza.io

追記
$left $right をそれぞれ
[][]
[""][""]
[""][]
[][""]
の組み合わせで
var_dump()の出力結果の一覧は以下の画像になります(テキストだと見にくいので画像にまとめました)
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

(リモートデバッグ環境を整えるのがベストですが)
とりあえずvar_dump()で配列の状態を確認してみてください。

実行環境はpaiza.ioのphpのオンライン実行環境です

paiza.ioの環境でどれくらいの操作が許可されるのかはあまり知りませんが、ローカルに環境を作らないと詳細な検証は難しくなっていくと思います。(今回の範囲だけで言えば可能です)

PHP

1$left = [""]; 2for ($i = 1; $i < 5; $i++){ 3array_push($left, $i); 4} 5 6$right = [""]; 7for ($i = 1; $i < 10; $i +=2){ 8array_push($right, $i); 9} 10 11var_dump($left); 12var_dump($right); 13 14 15for ($i = 0; $i < 5; $i++){ 16 echo $i."番目 "; 17 echo $left[$i]; 18 echo $right[$i]; 19 echo "\n"; 20}

として、質問にあるようなコードを変更した時の配列の状態を確認すると疑問が解決すると思います。


$left = []

$left = [""]
の違いも

PHP

1$arr = []; 2var_dump($arr);//要素が0個の配列が表示される 3 4$arr2 = [""]; 5var_dump($arr2);//先頭要素が空文字で要素が一つの配列が表示される 6

と言う感じで最小限のコードで比較すると挙動が理解しやすくなります。

今回のケースだと

PHP

1 2$left = []; 3for ($i = 1; $i < 5; $i++){ 4array_push($left, $i); 5} 6

とすると、要素が4つの配列(インデックスが0-3なので$left[4]は存在しない)が出来上がり、

PHP

1 2$left = [""]; 3for ($i = 1; $i < 5; $i++){ 4array_push($left, $i); 5} 6

とすると、とすると、要素が5つの配列(インデックスが0-4なので$left[4]は存在する)が出来上がります。

投稿2020/03/15 13:40

編集2020/03/15 13:59
tanat

総合スコア18709

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

auto_miss56

2020/03/15 15:01

var_dump()の出力結果は 冗長になってしまうと思い載せていませんでした(追記しました) それぞれの結果を見ても、 私の思考能力が未熟なため、なぜ、この出力結果になるのかわかりません 特に $left[""] $right[] がなぜエラー出力にならないのかがわかりません 恐れ入りますが、もう一度ご教示お願いできますでしょうか? また >ローカルに環境を作らないと詳細な検証は難しくなっていくと思います。 とのことで、現在ローカルに環境を構築している最中です このようなコードを走らせた場合 ローカル環境でvar_dump()以外でどのような検証方法があるのでしょうか? そちらもご教授してくださいますと幸いです。
auto_miss56

2020/03/15 15:12

失礼しました どちらも 自己解決しました
tanat

2020/03/15 15:15

> 特に $left[""] $right[] がなぜエラー出力にならないのかがわかりません > 恐れ入りますが、もう一度ご教示お願いできますでしょうか? うーんと、PHPの配列の扱いについての理解が足りていない様に思います。 PHPでの配列の要素へのアクセスについて把握するの先決なので、 まずはPHPマニュアル(公式リファレンス) https://www.php.net/manual/ja/language.types.array.php を一通り読む&各サンプルコードを実行してみて、配列の扱い方について把握してから 今回のケース($left=[];とした場合)だと $left[4]が存在しないのにforの中で$left[4]を参照しようとしてエラーが発生しています。 これは例えば $left = []; echo $left[4];//配列を初期化した後何もしていないので当然$left[4]は存在しない としても同じエラーが出ます。 > ローカル環境でvar_dump()以外でどのような検証方法があるのでしょうか? PHP リモートデバッグ xdebug ブレークポイント 辺りが検索キーワードになるので調べてみてください。 IDEの設定も必要になるので若干ハードルは上がりますが、PHPのコードにブレークポイントを仕掛けて、途中で処理を止めて変数の中身を確認することが出来るようになります。
tanat

2020/03/15 15:16

あ、コメントを書いてる間に解決したんですね。 良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問