使用递归函数的数组之和

时间:2014-04-19 06:31:00

标签: php arrays recursion

我是一个php开发人员,我研究过递归函数,我编码用递归函数找到数组中的元素总和,但是我得到了错误。

我从互联网上获取的代码

$example = array(10,20,30);


function sum_array($array) {


$total = 0;
foreach ($array as $element) {
    if(is_array($element)) {
        $total += sum_array($element);
    } else {
        $total += $element;
    }
}
return $total;


}

echo sum_array($example); // Outputs 60

我的代码

<?php
 $example = array(10,20,30);

function add_me($arr) {

  if($arr==0) {

    return $arr;



 } 
  return add_me($arr[0]+$arr[1]+$arr[2]);



}

我从互联网上找到的第一个代码效果很好,但是在我的代码中它会出错。当我使用echo add_me($example);调用它时,它会形成错误。

你能告诉我为什么会那样..任何帮助都会受到赞赏。谢谢。

5 个答案:

答案 0 :(得分:1)

使用array_sum($array) PHP函数

答案 1 :(得分:1)

由于我无法对您的代码执行任何操作以使其正常运行,我想我会解释您从互联网上获得的功能:

//Set sample data
$example = array(10,20,30);
function sum_array($array) {
    //first time called, we start at 0
    $total = 0;
    //Loop through each value in the array
    foreach ($array as $element) {
        //If the value is another array, we use recursion
        if(is_array($element)) {
            //using the recursion, we send the array to this function and add to total
            $total += sum_array($element);
        } else {
            //value was not an array, but scalar, add to total
            $total += $element;
        }
    } // Go to next value
    //Give the total back to asker
    return $total;
}
echo sum_array($example); // Outputs 60

这与您为每行添加注释的代码相同。有关它如何与$example数组一起使用的示例,它将会:

sum_array([10,20,30])
$total = 0
$element = 10
$total += 10  //10
$element = 20
$total += 20 //30
$element = 30
$total += 30 //60

return $total //60

使用示例数据,根本不会发生递归,如果你有一个数组作为其中一个值,即[10, [5, 2], 20],那么它会像:

sum_array([10,[5,2],20])
$total = 0
$element = 10
$total += 10  //10
$element = [5, 2]
sum_array([5,2])
    $total_1 = 0
    $element_1 = 5
    $total_1 += 5 //5
    $element_1 = 2
    $total_1 += 2  //7
    return $total_1 //7
$total += $total_1 //17
$element = 20
$total += 20 //37
return $total //37

希望这有助于您理解递归。

答案 2 :(得分:1)

如果您正在尝试创建递归函数,请使用以下命令:

function sum_array($array)
{
    $sum = 0;
    foreach ($array as $value) {
        // if the value itself is an array
        // recurse further: call the function again
        if (is_array($value)) {
            $sum = $sum + sum_array($value);
        }
        // if the value is not an array,
        // simply add it to $sum
        else {
            $sum = $sum + $value;
        }
    }
    return $sum;
}

echo sum_array([3, 4, [5,6], 8]); // => 26

is_array()检查值是否为数组,如果是,则再次调用该函数。如果该值不是数组,则只将该值添加到$sum。最后,返回$sum


这可以通过多种方式完成。以下是一些:

使用array_walk_recursive()

function sum_array($array) {
    $sum = 0;
    array_walk_recursive($array, function($v) use (&$sum) {
        $sum += $v;
    });
    return $sum;
}

echo sum_array([3, 4, [5,6], 8]); // => 26

使用array_reduce()

function callback($v, $w) {
    return $v + (is_array($w) ? array_reduce($w, __FUNCTION__) : $w);
}

echo array_reduce([3, 4, [5,6], 8], 'callback'); // => 26

答案 3 :(得分:0)

如果您正在寻找数组的递归,可以使用RecursiveArrayIterator类,另请参阅RecursiveIteratorIterator class

简单说明(摘自this answer):

<?php
$a = array(1,2,array(3,4, array(5,6,7), 8), 9);
$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($a));
foreach($it as $v) {
    $new_arr[] = $v;
}
echo array_sum($new_arr); // "prints" 45

答案 4 :(得分:0)

class Geocodeschool
  include Mongoid::Document

  embedded_in :school

  field :school_premium_aside, type: Array

end