Home > Backend Development > PHP Tutorial > Problem with returning value from a recursive method in PHP

Problem with returning value from a recursive method in PHP

WBOY
Release: 2016-10-22 00:14:11
Original
911 people have browsed it

<code><?php
$array = array(
    0 => array(
      '1a' => '',
      '3a' => '',
      '6a' => array(
        '6a1' => '',
        '6a2' => '',
        '6a3' => array(
          '6a31' => '',
          '6a33' => '',
          '6a34' => '1',
          ),
        ),
      ),
    1 => array(
      '3b' => '',
      '4b' => array(
        '4b1' => '',
        '4b2' => '',
        ),
      '6b' => '',
      )
    );

function search_val($key, $arr) {
  $v = '';
  foreach ($arr as $ks => $vs) {
    if($ks != $key && is_array($vs)) {
      search_val($key, $vs);
    }else if($ks != $key && is_string($vs)) {
      continue;
    }else if($ks == $key) {
      $v = $vs;
      break;
    }
  }
  return $v; 
  //var_dump($v);exit; //这里是有值的 为1
  //echo $v;  //测试这样可以直接输出
}
$va = search_val('6a34', $array);
var_dump($va); //$va始终为空 
</code>
Copy after login
Copy after login

The meaning of this method is to get the value corresponding to val for the subscript $key. I return $v at the end of the method, and then I assign the result of this return to a value $va, this The value is always empty, but when I print $v at the end of the method, it has a value. Why is this? Is it a problem with variable scope or is it caused by irregularities in my code? Solve

Reply content:

<code><?php
$array = array(
    0 => array(
      '1a' => '',
      '3a' => '',
      '6a' => array(
        '6a1' => '',
        '6a2' => '',
        '6a3' => array(
          '6a31' => '',
          '6a33' => '',
          '6a34' => '1',
          ),
        ),
      ),
    1 => array(
      '3b' => '',
      '4b' => array(
        '4b1' => '',
        '4b2' => '',
        ),
      '6b' => '',
      )
    );

function search_val($key, $arr) {
  $v = '';
  foreach ($arr as $ks => $vs) {
    if($ks != $key && is_array($vs)) {
      search_val($key, $vs);
    }else if($ks != $key && is_string($vs)) {
      continue;
    }else if($ks == $key) {
      $v = $vs;
      break;
    }
  }
  return $v; 
  //var_dump($v);exit; //这里是有值的 为1
  //echo $v;  //测试这样可以直接输出
}
$va = search_val('6a34', $array);
var_dump($va); //$va始终为空 
</code>
Copy after login
Copy after login

The meaning of this method is to get the value corresponding to val for the subscript $key. I return $v at the end of the method, and then I assign the result of this return to a value $va, this The value is always empty, but when I print $v at the end of the method, it has a value. Why is this? Is it a problem with variable scope or is it caused by irregularities in my code? Solve

Function is changed to the following. There is something wrong with your logic. You need to use return for data interaction between methods. The final value you get can be regarded as what search_val returns to you, so just return it here.

<code class="php">
 function search_val($key, $arr) {
            foreach ($arr as $ks => $vs) {
                if($ks != $key && is_array($vs)) {
                    return search_val($key, $vs);
                }else if($ks != $key && is_string($vs)) {
                    continue;
                }else if($ks == $key) {
                    return $vs;
                }
            }
            //return $v;
            //var_dump($v);
        }
        </code>
Copy after login

To put it bluntly, recursion means calling yourself.
The function call itself in your code does not get its return value.
Secondly, pay attention to the processing of the results returned by yourself.

<code>function search_val($key, $arr) {
    if (!is_array($arr) || empty($arr)) {
        return false;
    } else {
        foreach ($arr as $k => $v) {
            if ($k === $key) {
                return $v;
            } 
            if (is_array($v) && !empty($v)) {
                $re =  search_val($key, $v);
                if ($re !== false) {
                    return $re;
                } 
            } 
            continue;
        }
    }
    return false;
}</code>
Copy after login
Related labels:
php
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template