【问题标题】:recursive function - help returning value when calling function递归函数 - 调用函数时帮助返回值
【发布时间】:2013-08-01 17:11:58
【问题描述】:

我有一个多维数组要搜索:

> Array (
>     [91] => Array
>         (
>             [FoSW] => 117
>             [DfLR] => 107
>             [FoA] => 0
>             [SoG] => 116
>             [RST] => 38
>             [SSW] => 0
>             [total] => 458
>         )
> 
>     [92] => Array
>         (
>             [FoSW] => 118
>             [DfLR] => 0
>             [FoA] => 58
>             [SoG] => 0
>             [RST] => 0
>             [SSW] => 40
>             [total] => 463
>         ) //etc....

我正在使用这个函数来搜索值并返回它的键。如果未找到该值,则将值减一并再次搜索。

$search 是 md 数组

$type 例如是 SoG(md 数组第二级中的一个键)

例如,$score 的值为 0f 24

注意:在整个数组中没有值为 24 的 SoG

function find_percentile($search, $type, $score){

    foreach($search as $key=>$val){

        if ($val[$type]== $score){
            return $key;
            $found = true;
        }
        else {
            $found = false;
        }
    }
    if ($found == false){
        $new_score = $score - 1;
        find_percentile($search, $type, $new_score);
    }
}

如果我从 foreach 循环中回显 $key,它最终会回显出递归找到的键。

但是当我用函数构建一个单独的数组或回显该函数时,它没有得到递归找到的键。

$perc_array[$key] = find_percentile($percentiles, $key, $val); 

这只会附加匹配的值。递归找到的值不会在这个数组中。

echo find_percentile($percentiles, $key, $val);

不会回显递归找到的值。

【问题讨论】:

  • 为什么不直接使用array_search()?
  • FoA 和 SoG 的值可能为 24
  • 如果你使用array_search,你可以array_search($score, $search)并且你不需要做任何递归..你可以遍历每个二维..
  • 我正在搜索所有 100 个主密钥。每个主密钥的每个密钥子集都重复。 [100][sog] = 1, [99][sog] = 2 等等...我正在寻找哪个主密钥具有 [sog]=24,如果没有找到,请转到 [sog]=23 等等.. .

标签: php recursion multidimensional-array


【解决方案1】:

你忘了返回值,由函数返回:

if ($found == false){
    $new_score = $score - 1;
    return find_percentile($search, $type, $new_score);//<- here
}

【讨论】:

  • 真的吗???你不知道我现在有多放心。但是,我认为它会再次调用该函数,直到在 if 语句中返回找到的值......我有点困惑。
  • @SmithSmithy “我认为它会再次调用该函数,直到在 if 语句中返回找到的值” - 它会调用该函数,但它的值不会被返回。试着模仿,计算机是如何工作的,仔细地把所有的步骤写在纸上。
【解决方案2】:
function find_percentile($search, $type, $score){
    $max = null;
    $where = 0;
    foreach($search as $key=>$val){
         if ($val[$type]== $score){
              return $key;
         } else if($val[$type]>$max && $val[$type] < $score) {
              $where = $key;
              $max = $val[$type];
         }
    }
    return $where;
}

【讨论】:

    猜你喜欢
    • 2011-05-05
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 2011-08-01
    • 2020-10-10
    • 2021-06-11
    • 2012-03-11
    相关资源
    最近更新 更多