2014-12-28 21 views
6

我有一些值的數組,我需要轉換爲新數組並將每個值與所有以前的值相加。例如(數組長度,鍵和值總是不同),這是我有:總結每個最後的值與數組中的所有以前的值

Array 
(
    [0] => 1 
    [1] => 1 
    [2] => 5 
    [3] => 1 
    [4] => 1 
    [7] => 1 
    [8] => 3 
    [9] => 1 
) 

,這正是我需要的:

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 7 
    [3] => 8 
    [4] => 9 
    [7] => 10 
    [8] => 13 
    [9] => 14 
) 

我嘗試了許多不同的方法,但始終堅持的東西或者意識到我錯了某個地方。我有一種感覺,我試圖在這裏重新發明輪子,因爲我認爲必須有一些簡單的功能,但沒有找到解決方案的運氣。這是我試過的最後一種方式:

$array = array("0"=> 1, "1"=> 1, "2"=> 5, "3"=> 1, "4"=> 1, "7"=> 1, "8"=> 3, "9"=> 1); 
$this = current($array); 
$next = next($array); 
$end = next(end($array)); 
$sum = 0; 
$newArray = array(); 

foreach ($array as $val){ 
    if($val != $end){ 
     $sum = ($this += $next); 
     array_push($newArray, $sum); 
    } 
} 

print_r($newArray); 

..很遺憾再次發生錯誤。我花了很多時間找到如何不到達我需要的地方,有人可以將我踢向正確的方向嗎?

回答

4

建議您使用array_slice() & array_sum()

$array = array("0"=>1,"1"=>1,"2"=>5,"3"=>1,"4"=>1,"7"=>1,"8"=>3,"9"=>1); 
$keys = array_keys($array); 
$array = array_values($array); 

$newArr = array(); 

foreach ($array as $key=>$val) { 
    $newArr[] = array_sum(array_slice($array, 0, $key+1)); 
} 
$newArr = array_combine($keys, $newArr); 

print '<pre>'; 
print_r($newArr); 
print '</pre>'; 

輸出:

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 7 
    [3] => 8 
    [4] => 9 
    [7] => 10 
    [8] => 13 
    [9] => 14 
) 

參考:

+1

你計算陣列和與切片一遍又一遍的價值觀,你知道媒體鏈接從一個先前計算的總和......沒必要切片和陣列總和......這會消耗內存和CPU無... – Nimrod007

+0

謝謝!這正是我所需要的,我使用這些(非連續)索引將此輸出與另一個數組配對。 – b3da

1

你可以去訪問數組之和添加到新陣列(以簡單的方式):

$array = array("0"=> 1, "1"=> 1, "2"=> 5, "3"=> 1, "4"=> 1, "7"=> 1, "8"=> 3, "9"=> 1); 
var_dump($array); 
$newArray = array(); 

$sum = 0; 
foreach ($array as $a){ 
    $sum += $a; 
    $newArray[]=$sum; 
} 

var_dump($newArray); 
1

你複雜太多。循環遍歷數組中的所有元素並將當前元素添加到sum中。然後將該總和分配給新陣列。

$array = array("0"=> 1, "1"=> 1, "2"=> 5, "3"=> 1, "4"=> 1, "7"=> 1, "8"=> 3, "9"=> 1); 

$sum = 0; 
$newArray = array(); 

foreach ($array as $key=>$val){ 
    $sum += $val; 
    $newArray[$key]=$sum; 
} 

確保索引正確。

+1

你的意思是'$ sum + = $ val'?我認爲它錯了'$ sum + = $ sum;' –

2
$sums = array_reduce($array, function (array $sums, $num) { 
    return array_merge($sums, [end($sums) + $num]); 
}, []); 

換句話說,這個迭代陣列(array_reduce)結束,在每次迭代中追加(array_merge)一個號碼到一個新的數組($sums),其是在陣列中的先前項的總和(end($sums))和當前的號碼。使用PHP 5.4+陣列語法([])。

+0

乾淨的解決方案,儘管一些解釋可以幫助經驗較少的人理解。 – fejese

4

讓我們假設你的數組變量是$ a; 您可以使用簡單的for循環

for($i=1;$i<sizeof($a);$i++) 
    { 
     $a[$i]=$a[$i]+$a[$i-1]; 
    } 
+0

這不會起作用,因爲'$ a [0]'將爲空。 –

+0

@GopakumarGopalan $ a [0]已經是1. –

+0

哦!你正在操縱相同的陣列...那麼它的一切都很好 –

相關問題