2011-09-14 12 views
0

私は検索しています。私は知恵の終わりですので、これを簡単にします。これは私がしますprint_rに持っているものです。キー配列によるグループの値

Array 
(
    [0] => Array 
     (
      [name] => client interaction 
      [y] => 2.7 
     ) 

    [1] => Array 
     (
      [name] => client interaction 
      [y] => 0.1 
     ) 

    [2] => Array 
     (
      [name] => project planning 
      [y] => 0.1 
     ) 

    [3] => Array 
     (
      [name] => client interaction 
      [y] => 5.9 
     ) 

) 

そして、これは私がそれになりたいものです。

Array 
(
    [0] => Array 
     (
      [name] => client interaction 
      [y] => 8.7 
     ) 

    [1] => Array 
     (
      [name] => project planning 
      [y] => 0.1 
     ) 

) 
+0

は、 "簡単な方法" はありません。元の配列を繰り返し処理し、名前でインデックス付けされた別の配列を作成します。 – Candide

答えて

2
$hash = array(); 
foreach ($sourceArray as $key=>$value) { 
    $y = 0; 
    if (isset($hash{$value{'name'}})) { 
     $y = $hash{$value{'name'}}; 
    } 

    $hash{$value{'name'}} = $y + $value{'y'}; 
} 

$result = array(); 
foreach ($hash as $key => $value) { 
    $result[] = array('name' => $key, 'value' => $value); 
} 
print_r($result); 

最後のループはちょうどあなたが指定した正確な形式に$hashを取得することです。


説明:

$hash 

それぞれ固有の名前のために合計を計算するために使用される一時的な構造です。

foreach ($sourceArray as $key=>$value) { 

これは元の配列($ sourceArray)を通って各要素を引き出します。

変数を初期化して、その名前に属する現在の合計を格納します。

if (isset($hash{$value{'name'}})) { 

指定された名前の値がすでに$hashに保存されているかどうかを確認します。

 $y = $hash{$value{'name'}}; 
    } 

与えられた名前の前に計算された合計が存在する場合は、その合計を$ yに設定します。

$hash{$value{'name'}} = $y + $value{'y'}; 
} 

与えられた名前の合計を一時構造$hashに格納します。

$result = array(); 
    foreach ($hash as $key => $value) { 
     $result[] = array('name' => $key, 'value' => $value); 
    } 

は、希望のフォーマットに$ hashを変換します。

$result[] = ...のempy []は$result配列の最後に式の右辺を追加します。

+0

こんにちは。この行のオペランドが反転しているように見えませんか?あなたは$ hash {$ name {}} = $ y;を意味すると思います。 –

+0

いいえ、それは正しいです。$ y = $ hash {$ value {'name'}}その行は、次の行に追加するために前に見たものにyを初期化しています。 –

+0

ああ..ありがとう。私は '!isset' +1を見たと思った –

4

あなたの望む配列が数字を使用することは絶対に必要ですか?私はこれを行うとしたら、私は、このようにそれを行うだろう(ご希望の配列と同じではありませんが)

$newArray = array(); 
foreach($array as $item) 
{ 
    if(!isset($newArray[$item["name"]])) 
    $newArray[$item["name"]] = 0; 

    $newArray[$item["name"]] += $item["y"]; 
} 

これはあなたにこの構造体の配列を与える:

Array 
(
    [client interaction] => 8.7 
    [project planning] => 0.1 
) 

をキーを取得するにはバックあなたは単にname$yが含まれていますforeachループ

foreach($newArray as $name => $y) 

$nameの二番目の形式を使用します元の配列の。

0
$mixed = array(); // Should contain your array shown above 
$groups = array(); 
$newArray = array(); // Will contain your new array 
$counter = 0; 

foreach($mixed as $mix) 
{ 
    if (isset($groups[$mix['name']])) 
    { 
     $newArray[$groups[$mix['name']]]['y'] += $mix['y']; 
    } 
    else 
    { 
     $groups[$mix['name']] = $counter; 
     $newArray[] = $mix; 
     $counter++; 
    } 
} 

http://codepad.org/EjdHxgvt

関連する問題