2011-11-05 60 views
0

我已經寫了這個代碼:確定,如果數組有負數,並將其更改爲零

$final = array(
    ($data[0] - $data[1]), 
    ($data[1] - $data[2]), 
    ($data[2] - $data[3]), 
    ($data[3] - $data[4]), 
    ($data[4] - $data[5]), 
    ($data[5] - $data[6]) 
); 

他們中有些人將返回負數(-13-42等),如何改變負到0

通過的思維方式我這樣做後:

$data_string = join(",", $final); 

例子:我需要將其轉換就像下面這個:

1,3,-14,53,23,-15 => 1,3,0,53,23,0 

回答

1

我喜歡Hakre的緊湊型答案。但是,如果你有更復雜的要求,您可以使用函數:

<?php 

$data = array(11,54,25,6,234,9,1); 

function getZeroResult($one, $two) { 
    $result = $one - $two; 
    $result = $result < 0 ? 0 : $result; 

    return $result; 
} 

$final = array(
    getZeroResult($data[0], $data[1]), 
    getZeroResult($data[1], $data[2]), 
    getZeroResult($data[2], $data[3]), 
    getZeroResult($data[3], $data[4]), 
    getZeroResult($data[4], $data[5]), 
    getZeroResult($data[5], $data[6]) 
); 

print_r($final); 

?> 

http://codepad.org/viGBYj4f(隨着echo顯示試驗前$result。)

它給你:

Array 
(
    [0] => 0 
    [1] => 29 
    [2] => 19 
    [3] => 0 
    [4] => 225 
    [5] => 8 
) 

注意,你也可以直接返回三元:

function getZeroResult($one, $two) { 
    $result = $one - $two; 
    return $result < 0 ? 0 : $result; 
} 

除了在循環中使用它:

<?php 

$data = array(11,54,25,6,234,9,1); 

function getZeroResult($one, $two) { 
    $result = $one - $two; 
    echo "$one - $two = $result\n"; 
    return $result < 0 ? 0 : $result; 
} 

$c_data = count($data)-1; 
$final = array(); 

for ($i = 0; $i < $c_data; $i++) { 
    $final[] = getZeroResult($data[$i], $data[$i+1]); 
} 

print_r($final); 

?> 

http://codepad.org/31WCbpNr

+0

謝謝,乾淨,可以理解!這只是一個問題,我在while循環中使用它,並且第二次拋出一個錯誤:'不能重新聲明getZeroResult()(以前在C:\ xampp \ htdocs \中聲明):40 C:\ xampp \ htdocs \ 40行' – Ricardo

+0

你能幫我解決這個錯誤嗎? – Ricardo

+0

不要在'while','foreach'或'for'循環中聲明一個函數。在全局範圍內聲明它(不在其他任何構造中)。 –

2

猜這是功課。如果是這樣,請將其標記爲。

提示:

  • 使用循環,而不是硬佈線陣列的引用。
  • 使用if語句檢查負值並切換其符號。
  • 您的使用加入是正確的
+0

基本上我喜歡在工作時學習(不,它不是一項家庭作業)我只是建立一些腳本來獲得經驗。至於答案 - 我在考慮if語句,我可以這樣做,但我想知道是否有一些「乾淨」的方式來做到這一點。關於循環,我該怎麼做? – Ricardo

6

您可以映射:

$zeroed = array_map(function($v) {return max(0, $v);}, $final); 

將會把所有的數字低於0比0

array_mapmax

此外,您可以爲您節省更多的筆跡與$data

$final = array_reduce($data, function($v, $w) 
{ 
    static $last; 
    if (null !== $last) $v[] = max(0, $last - $w); 
    $last = $w; 
    return $v; 
}, array()); 

$data_string = join(",", $final); 

array_reduce

編輯: foreach循環可能會更容易理解,我添加了一些意見,以及:

// go through all values of data and substract them from each other, 
// negative values turned into 0: 
$last = NULL; // at first, we don't have a value 
$final = array(); // the final array starts empty 
foreach($data as $current) 
{ 
    $isFirst = $last === NULL; // is this the first value? 
    $notFirst = !$isFirst; 

    if ($notFirst) 
    { 
     $substraction = $last - $current; 
     $zeroed = max(0, $substraction); 
     $final[] = $zeroed;   
    } 
    $last = $current; // set last value 
} 

這裏是demo

+0

看起來像我一直在尋找的東西,但似乎你忘了那裏的一封信或兩封信,我現在會注意到這個錯誤。 – Ricardo

+0

我只是輸入它,代碼未經測試,讓我檢查。 - 第二個例子是錯誤的,這需要另一個映射 - 現在修復。 – hakre

+0

哦,我的天哪,我認爲你的答案更像是親你喜歡你,因爲我不能真正理解這裏發生了什麼,猜猜現在閱讀文檔。 – Ricardo

相關問題