2017-03-05 3 views
1

Associative array, sum values of the same keyにあるスレッドを展開したいと思います。連想配列、同じキーの値: "兄弟"値の合計と平均を取得

Table

OPが求められます。

代わりにキー "会議" を3回繰り返しを持ちます。私は にそれを一度持っていき、3つの値を1つにまとめます。

与えられた答えは次のとおりです。

$sum = array_reduce($data, function ($a, $b) { 
    isset($a[$b['event']]) ? $a[$b['event']]['budget'] += $b['budget'] : $a[$b['event']] = $b; 
    return $a; }); 

私が二つ以上の値を持つ連想配列を持っています。上記のような関数を使いたいですが、すべての値をまとめて「予算」だけではありません。ここ は、私の状況を反映している例です。

次のように配列である:

$data = array(
    0 => array(
    'event' => 'Conference', 
    'budget' => 3700, 
    'people' => 200, 
    'rate' => 3000, 
), 
    1 => array(
    'event' => 'Conference', 
    'budget' => 500, 
    'people' => 200, 
    'rate' => 6000, 
), 
    2 => array(
    'event' => 'Showroom', 
    'budget' => 1000, 
    'people' => 400, 
    'rate' => 30000, 
), 
    3 => array(
    'event' => 'Mission Chez client', 
    'budget' => 2000, 
    'people' => 200, 
    'rate' => 3000, 
), 
    4 => array(
    'event' => 'Séminaire', 
    'budget' => 700, 
    'people' => 40, 
    'rate' => 3000, 
), 
    5 => array(
    'event' => 'Livraison', 
    'budget' => 4000, 
    'people' => 2, 
    'rate' => 3000, 
), 
    6 => array(
    'event' => 'Conference', 
    'budget' => 334, 
    'people' => 200, 
    'rate' => 9000, 
), 
); 

私は上記のコードを使用している場合は、私は次のように、一つのエントリに「会議」を削減することができるようになります。

[0] => Array 
     (
      [event] => Conference 
      [budget] => 4534 
      [people] => 200 
      [rate] => 5000 
     ) 

予算の数字は正しいです。しかし、人々の姿はそうではありません。 「人」と「予算」の合計をどのようにして得ることができるので、 [人] => 600ですか?

最後に、簡単に平均「」の値を得ることは可能ですか?だから会議のためには((3000 + 6000 + 9000)/ 3 = 6000)。あなたが試みることができるの平均値については

$sum = array_reduce($data, function ($a, $b) { 
    if (!isset($a[$b['event']])) { 
      $a[$b['event']] = $b; 
    } else { 
     $a[$b['event']]['budget'] += $b['budget']; 
     $a[$b['event']]['people'] += $b['people']; 
     $a[$b['event']]['rate'] += $b['rate']; 
    } 
return $a; }); 

を試してみてください

[0] => Array 
      (
       [event] => Conference // Key that appears multiple times 
       [budget] => 4534 //Sum of all conference budget 
       [people] => 600 //Sum of all conference people 
       [rate] => 5000 //Average rate of conference 
      ) 
+0

ですあなたはここにサードパーティの図書館を持ち込むことに反対しましたか? Laravelのコレクションには、これを手助けするいくつかの方法があります。 – FatBoyXPC

+0

公正な質問。それが第三者の図書館の道を行く必要があるならば、そうしてください。 :) しかし、これはかなり控えめなオンラインダッシュボードプロジェクトであり、ほんの数人のパートナーによって使用されています。 $$を節約するために、できるだけ共有ホスティングを購入したいと思います。私が理解しているように、共有ホスティングはあなたがインストールできるものに関して制限されることがあります。うーん...あなたは私に不思議に思っている。 – Chris

+0

@FatBoyXPCなぜ単純なループのために巨大な大砲を持って来たいですか?この場合、サードパーティ製のライブラリは、C言語のPHP拡張機能でない限り、高速化できません。より読みやすいものの、確かに効率的ではありません。 – Zefiryn

答えて

2

すべてのすべてで、私のような結果を得るためにテーブルを整理しようとしています

$sum = array_reduce($data, function ($a, $b) { 
    if (!isset($a[$b['event']])) { 
      $a[$b['event']] = $b; 
      $a[$b['event']]['rate_count'] = 1; 
      $a[$b['event']]['average_rate'] = array($b['rate']); 
    } else { 
     $a[$b['event']]['budget'] += $b['budget']; 
     $a[$b['event']]['people'] += $b['people']; 
     $a[$b['event']]['rate'] += $b['rate']; 
     $a[$b['event']]['rate_count'] += 1; 
     $a[$b['event']]['average_rate'] = $a[$b['event']]['rate']/$a[$b['event']]['rate_count']; 
    } 
return $a; }); 
+0

ありがとう!それはすべての合計を得るためには完璧です(私はセミコロンを6行目と7行目の末尾に追加する必要がありました)。どのように合計の代わりに 'レート'のための平均を得るための任意のアイデア?私はそれがおそらくもう少しプロセスに関わっていることを理解しています。 – Chris

+0

@Chris私は平均を追加するための応答を編集しました – Zefiryn

+0

私にこれをつけてくれてありがとう。私はとても感謝しています。 新しいコードは完全に「rate_count」を取得している - の会議のためには、3 を示しています。しかし「会議」の平均は6000である必要がありながら、それは= 3000 3000 + 6000 + 9000 = 18000として 3分の18000を示しています6000 私は希望の結果を得るためにコードを追加しようとしましたが、私はそこにはかなりありません。何が欠けているかも知っていますか? もう一度Zefirynに感謝します。 – Chris

関連する問題