2016-01-22 55 views
-2

相同的值,總和基地我喜歡陣列作爲跟隨,

Array(
    [0] => Array(
     [account] => 251234567890, 
     [price] => 83 
    ) [1] => Array(
     [account] => 251234567890, 
     [price] => 27 
    ) [2] => Array(
     [account] => 251234564526, 
     [price] => 180 
    ) [3] => Array(
     [account] => 251234567890, 
     [price] => 40 
    ) 
) 

與我想用同樣的account與和合並數組的是特定pricePHP自定義的數組現在合併對價值

我想輸出數組這樣,

Array(
    [251234567890] => Array(
     [account] => 251234567890, 
     [price] => 150 
    ) [251234564526] => Array(
     [account] => 251234564526, 
     [price] => 180 
    ) 
) 

我已經試過這樣的,

$res = array(); 
$k = 0; 
foreach ($to_account as $vals) { 
    if (array_key_exists($vals['account'], $res)) { 
    $res[$k]['price'] += $vals['price']; 
    $res[$k]['account'] = $vals['account']; 
    $k++; 
    } else { 
    $res[$k] = $vals; 
    $k++; 
    } 
} 

正如在這裏輸入數組只有兩個獨特account存在這樣輸出數組應該是這兩個帳戶與它的價格總和

我hav見過從here,但想是有幫助的,因爲它是在Python我希望它在php像這樣在python我希望有人能幫助我在這

謝謝

+3

讓我們瞭解您在這裏嘗試 – Epodax

+1

檢查[我的解決方案(https://eval.in/506410) –

回答

0

@Jeroen Noten的答案對我來說是有用的,但我已經解決了我自己的這個樣子,

$final_payment_array = array(); 

foreach ($to_account as $vals) { 
    if (array_key_exists($vals['account'], $final_payment_array)) { 
      $final_payment_array[$vals['account']]['price'] += $vals['price']; 
      $final_payment_array[$vals['account']]['account'] = $vals['account']; 
    } else { 
      $final_payment_array[$vals['account']] = $vals; 
     } 
} 

我覺得這一個是性能明智

的最佳解決方案

謝謝

+2

是更好,但不給你如您的問題所述,在您編輯之前,您需要的確切結果。數組的鍵現在是帳號,而不是0,1等,這就是我的方法的原因。但如果你不在乎鑰匙,那很好。 –

3

我會做到這一點在兩個步驟,由賬戶第一項,然後轉換爲所需的輸出格式:

$data = [ 
    [ 
    'account' => 251234567890, 
    'price' => 83 
    ], 
    [ 
    'account' => 251234567890, 
    'price' => 27 
    ], 
    [ 
    'account' => 251234564526, 
    'price' => 180 
    ], 
    [ 
    'account' => 251234567890, 
    'price' => 40 
    ], 
]; 


$keyed = []; 
foreach ($data as $item) { 
    if (!isset($keyed[$item['account']])) { 
    $keyed[$item['account']] = 0; 
    } 
    $keyed[$item['account']] += $item['price']; 
} 

$merged = []; 
foreach ($keyed as $account => $price) { 
    $merged[] = compact('account', 'price'); 
} 

print_r($merged); 

或者,更實用的解決方案(這是我喜歡的,但有些難於理解):

$keyed = array_reduce($data, function ($carry, $item) { 
    if (!isset($carry[$item['account']])) { 
    $carry[$item['account']] = 0; 
    } 
    $carry[$item['account']] += $item['price']; 
    return $carry; 
}, []); 

$merged = array_map(function ($account, $price) { 
    return compact('account', 'price'); 
}, array_keys($keyed), $keyed); 
2

如果你嘗試做類似的事情怎麼辦:

$arr = array(
    0 => array(
     'account' => 251234567890, 
     'price' => 83 
    ), 1 => array(
     'account' => 251234567890, 
     'price' => 27 
    ), 2 =>array(
     'account' => 251234564526, 
     'price' => 180 
    ), 3 => array(
     'account' => 251234567890, 
     'price' => 40 
    ) 
); 

foreach($arr as $key => $value) { 
    $newArr[$value['account']][] = $value['price']; 
} 

foreach($newArr as $key => $value) { 
    $finalArr[] = array('account'=>$key,'price'=>array_sum($value)); 
} 

$ finalArr:

Array ([0] => Array ( 
[account] => 251234567890 
[price] => 150) 
[1] => Array ( 
[account] => 251234564526 
[price] => 180))