teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

誤字を訂正しました

2021/12/09 17:41

投稿

nikuatsu
nikuatsu

スコア177

title CHANGED
File without changes
body CHANGED
@@ -60,7 +60,7 @@
60
60
  }else{
61
61
  $tmp = true;
62
62
  }
63
- if( $tmp ) return '$depth';
63
+ if( $tmp ) return $depth;
64
64
  }
65
65
 
66
66
  var_dump( depth_errors($ary) );

3

試したことに追記しました

2021/12/09 17:41

投稿

nikuatsu
nikuatsu

スコア177

title CHANGED
File without changes
body CHANGED
@@ -50,4 +50,18 @@
50
50
  }
51
51
 
52
52
  var_dump( depth_errors($ary) );
53
+ ```
54
+ 続いて以下`$tmp`を使い、`return`のタイミングを変えてみたりもしたのですが、結果かわらず。でした。
55
+ ```php
56
+ function depth_errors( $ary, $depth = 0 ){
57
+ $tmp = false;
58
+ if( isset($ary['errors']) ){
59
+ depth_errors( $ary['errors'], $depth + 1 );
60
+ }else{
61
+ $tmp = true;
62
+ }
63
+ if( $tmp ) return '$depth';
64
+ }
65
+
66
+ var_dump( depth_errors($ary) );
53
67
  ```

2

誤字を訂正しました

2021/12/09 17:37

投稿

nikuatsu
nikuatsu

スコア177

title CHANGED
File without changes
body CHANGED
@@ -21,7 +21,7 @@
21
21
  `return`の1行前は正しい値なのに、`return`の戻り値が`NULL`となってしまいます。
22
22
 
23
23
  ### 該当のソースコード
24
- 単純に`isset($errors['errors'])`が`true`の限り、再帰を続ける。という条件で出来るだろうと考えたのですが、これがかなり不思議で`NULL`を得てしまいます。
24
+ 単純に`isset($ary['errors'])`が`true`の限り、再帰を続ける。という条件で出来るだろうと考えたのですが、これがかなり不思議で`NULL`を得てしまいます。
25
25
  ```php
26
26
  function depth_errors( $ary, $depth = 0 ) {
27
27
  if ( isset($ary['errors']) ) {

1

質問を絞りました

2021/12/09 17:32

投稿

nikuatsu
nikuatsu

スコア177

title CHANGED
File without changes
body CHANGED
@@ -1,9 +1,9 @@
1
1
  ### 前提・実現したいこと
2
2
  PHPです。
3
- 配列`$errors`から、キー`'errors'`の階層を数えたいです。
3
+ 配列`$ary`から、キー`'errors'`の階層を数えたいです。
4
4
  以下から`3`を得られれば正解です。
5
5
  ```php
6
- $errors = [
6
+ $ary = [
7
7
  'errors' => [
8
8
  'errors' => [
9
9
  'errors' => [
@@ -17,52 +17,37 @@
17
17
  ];
18
18
  ```
19
19
 
20
+ ### 発生している問題
21
+ `return`の1行前は正しい値なのに、`return`の戻り値が`NULL`となってしまいます。
20
22
 
21
- ### 発生している問題・エラーメッセージ
22
- 該当のソースコードにおいて、`'errors'`に限らず、`'others'`の階層まで得てしまいます。
23
-
24
23
  ### 該当のソースコード
25
- こちらネットで見つけたコードですが、これですと`'others'`5階層`5`を得てしまうのが問題です。
24
+ 単純に`isset($errors['errors'])`が`true`の限り、再帰を続る。という条件で出来るだろうと考えですが、これがり不思議で`NULL`を得てしまいます。
26
25
  ```php
27
- function array_depth($arr, $blank=false, $depth=0){
26
+ function depth_errors( $ary, $depth = 0 ) {
28
- if( !is_array($arr)){
27
+ if ( isset($ary['errors']) ) {
28
+ depth_errors( $ary['errors'], $depth + 1 );
29
+ } else {
29
30
  return $depth;
30
- } else {
31
- $depth++;
32
- $tmp = ($blank) ? array($depth) : array(0);
33
- foreach($arr as $value){
34
- $tmp[] = array_depth($value, $blank, $depth);
35
- }
36
- return max($tmp);
37
31
  }
38
32
  }
39
33
 
40
- var_dump(array_depth($errors));
34
+ var_dump( depth_errors($ary) );
41
35
  ```
42
36
 
43
37
  ### 試したこと
38
+ 次のように3行目で`var_dump`をかけてみると正しい値が得られているのに!
39
+ さらに6行目の`return`の1行前でも正しいのに!
44
- もっと単純に`isset($errors['errors'])`が`true`、再帰を続ける。という条件に変更してみたのです、これがかなり不思議で`NULL`を得てしまいます。
40
+ なぜか最後の`return`のが`NULL`となってしまいます。
45
41
  ```php
46
- function depth_errors( $errors, $depth = 0 ) {
42
+ function depth_errors( $ary, $depth = 0 ){
47
- if ( isset($errors['errors']) ) {
43
+ if( isset($ary['errors']) ){
44
+ var_dump($depth + 1); // 正しい値が得られている!
48
- depth_errors( $errors['errors'], $depth + 1 );
45
+ depth_errors( $ary['errors'], $depth + 1 );
49
- } else {
50
- return $depth;
51
- }
52
- }
53
-
54
- var_dump( depth_errors($errors) );
55
- ```
56
- 次のように3行目で`var_dump`をかけてみると正しい値が得られているのに…なぜか最後の`return`では`NULL`となってしまうようです。
57
- ```php
58
- function depth_errors( $errors, $depth = 0 ){
59
- if( isset($errors['errors']) ){
60
- var_dump($depth + 1); // ここを見ると正しい値が得られているのに…
61
- depth_errors( $errors['errors'], $depth + 1 );
62
46
  }else{
47
+ var_dump($depth);// ここでも正しい値が得られている!
63
48
  return $depth;
64
49
  }
65
50
  }
66
51
 
67
- var_dump( depth_errors($errors) );
52
+ var_dump( depth_errors($ary) );
68
53
  ```