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

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

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

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

Q&A

解決済

1回答

838閲覧

直前のダンプが効いているのに、次の行のreturnが効かない問題

mickymouse

総合スコア3

PHP

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

0グッド

0クリップ

投稿2020/07/10 11:23

###発生している問題
次のコードを実行し、aaaがダンプされ、bbbがされないのに、これが出力されるはずが返されません。
理由が知りたいのですが、お分かりになる方いらっしゃいますでしょうか?

php

1var_dump('aaa'); 2return 'これが出力されるはず'; 3var_dump('bbb');

###詳しいコード
hogeにあるのが上記の流れです。

php

1<?php 2$response_cake = [ 3 'cake' => [ 4 'items' => [] 5 ] 6]; 7 8$result_cake = valid_response( $response_cake ); 9var_dump($result_cake); 10 11function valid_response( $response ){ 12 13 $set = 'items'; 14 $required = [ 15 'cake' => [ 16 'items' => [] 17 ] 18 ]; 19 20 $result = hoge( $response, $required, $set ); 21 return $result; 22} 23 24function hoge( $response, $required, $set ){ 25 $result = ['初期値']; 26 foreach( $required as $k1 => $v1 ){ 27 if( $k1 != $set ){ 28 foreach( $response as $k2 => $v2 ){ 29 hoge( $v2, $v1, $set ); 30 } 31 }elseif( $k1 == $set ){ 32 var_dump('aaa'); 33 return 'これが出力されるはず'; 34 var_dump('bbb'); 35 } 36 } 37 return $result; 38}

私の考えはこうです。

hogeが実行され、$k1 == $setまで処理は進んでいる
・だからvar_dump('aaa');が効く
・そしてvar_dump('bbb');が効かない
・よってこれらの間のreturn 'これが出るはず';が効いていて、だからvar_dump('bbb');が効いていないのだとわかる
・というわけでこれが出力されるはずが出力されるはず

なのになぜ初期値が出力されるのか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

再帰処理のはずが、ここでreturnしていないから返らない。

Diff

1 foreach( $response as $k2 => $v2 ){ 2- hoge( $v2, $v1, $set ); 3+ return hoge( $v2, $v1, $set ); 4 }

もっと「どこをどう通って処理が終わっているか」を細かくデバッグした方が良いです。
例えば:

php

1function hoge( $response, $required, $set ){ 2 $result = ['初期値']; 3 echo __LINE__.PHP_EOL; 4 foreach( $required as $k1 => $v1 ){ 5 echo __LINE__.PHP_EOL; 6 if( $k1 != $set ){ 7 echo __LINE__.PHP_EOL; 8 foreach( $response as $k2 => $v2 ){ 9 echo __LINE__.PHP_EOL; 10 hoge( $v2, $v1, $set ); 11 } 12 }elseif( $k1 == $set ){ 13 echo __LINE__.PHP_EOL; 14 var_dump('aaa'); 15 echo __LINE__.PHP_EOL; 16 return 'これが出力されるはず'; 17 var_dump('bbb'); 18 } 19 } 20 echo __LINE__.PHP_EOL; 21 return $result; 22}

投稿2020/07/10 11:31

m.ts10806

総合スコア80850

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

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

mickymouse

2020/07/10 12:14

引き続いてのご回答ありがとうございます。なるほど__LINE__の方法はこれから活かしたいと思います。
m.ts10806

2020/07/10 12:16

デバッガ入れた方が手間はかからないと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問