2017-09-27 6 views
0

私は人の名前とその高さからなる配列を持っています。変数に割り当てられた関数にラップされた関数array_reduceを使って、平均の高さを求める必要があります。以下は私が今までに書いたコードです。配列がNULLであるarray_reduce関数に渡されるまで、すべてが機能しているようです。私はコード内のコメントで説明しようとしました。なぜ配列が突然削除され、最も内側の関数に渡すのですか?array_reduceを使用して配列から平均値を求める

$people = [ 
    ['name'=> 'John' , 'height'=> 1.65], 
    ['name'=> 'Peter' , 'height'=> 1.85], 
    ['name'=> 'Silvia', 'height'=> 1.69], 
    ['name'=> 'Martin', 'height'=> 1.82] 
]; 


$filter = function ($people) 
{ 
    $averageHeight = 0; 
    $count = count($people); 
    echo $count; 
    //if I var_dump($people) - the array $people is FINE. 
    return array_reduce(
      $people, 
      function ($people) use (&$averageHeight, &$count) 
      { 
       $averageHeight += $people['height']/$count;  
       return $averageHeight; 
       //var_dump($people); - var people is NULL. Where did it go? 
      } 
    ); 
}; 

print_r($filter($people)); 
+0

それはあなたが上記の宣言実際の配列を人の名前ではなく最初の関数パラメータですので、 '$のpeople'がnullの理由があります。 PHPはこのパラメータを 'carry 'と呼びます。デフォルトのキャリー値を指定しないと、nullとして開始されます。 – apokryfos

+0

平均高さを計算する別の方法は次のとおりです。 '$ averageHeight = array_sum(array_column($ people、 'height'))/ count($ people);' –

答えて

1

これは、あなたが平均を取得するためにarray_reduceを使用する方法である。

function array_average($array) { 
    $carry = null; 
    $count = count($array); 
    return array_reduce($array, function ($carried, $value) use ($count) { 
     return ($carried===null?0:$carried) + $value/$count; 
    },$carry); 
} 

関数は、パラメータとして、アキュムレータと値を取ると、次の要素に運ばれる値を返す必要があります。

あなたにそれを使用することができます。これは、その結果

$averageheight = array_average(array_column($people,"height")); 

1.7525

ここでは例です:

http://sandbox.onlinephpfunctions.com/code/a0bd15fb66061340ceca9e743418575d7990b6c3

あなたが呼び出し可能なように、この全体のことを必要とする場合次に:

function array_average($array) { 
    $carry = null; 
    $count = count($array); 
    return array_reduce($array, function ($carried, $value) use ($count) { 
     return ($carried===null?0:$carried) + $value/$count; 
    },$carry); 
} 

$filter = function ($people) { 
    return array_average(array_column($people,"height")); 
}; 

print_r($filter($people)); 

http://sandbox.onlinephpfunctions.com/code/dd2ec178be3989f8d9dd9d9ef5d270c7d40b8be7

+0

これはうまくいきますが、変数に変換する。 'print_r '(T_STRING)' – pidari

+0

@pidariが更新されました。これは、 'print_r($ filter(array_column($ people、" height ")));変数の中で関数を宣言することもできますが、それはかなり一般的なものですので、他の場所でもその用途を見つけることができます。 – apokryfos

0
Use this code, where the total array count we didn't find out inside the sum function so, i will use this into the print_r() function. 


<?php 

function sum($carry, $p) 
{ 
    $carry += $p['height']; 
    return $carry; 
} 

$people = [ 
    ['name'=> 'John' , 'height'=> 1.65], 
    ['name'=> 'Peter' , 'height'=> 1.85], 
    ['name'=> 'Silvia', 'height'=> 1.69], 
    ['name'=> 'Martin', 'height'=> 1.82] 
]; 

$k = 0; 
$k = array_reduce($people ,"sum"); 
print_r($k/count($people)); 
?> 
関連する問題