2013-08-23 40 views
0

我有一个textarea在我的HTML表单,用户可以输入数字和表格后提交,PHP将回声的数字总和 例如,如果我输入把一个textarea的字符串成组取决于空白

1 
2 

它将输出,

sum is 3 

我的要求是,如果我把空格(一个或多个),每个组装置之间,它有处理每个组设备分别 例如,

1 
2 

3 
4 

及以上应显示输出

sum is 3 
sum is 7 

但是,使用下面的代码我越来越像输出

sum is 10 

我的代码:

<html> 
<body> 

<div class="cal-main"> 
<form id="form1" name="form1" action=" " method="post" > 

<div class="input">Enter Numbers</div> 
<div class="output"><span><textarea class="textarea" name="numbers" ></textarea></span></div> 


<div class="submit1"> 
    <input id="first_submit" type="submit" name="first_submit" value="first_submit" /> 
</div> 

</form> 


<?php 

if (isset($_POST['first_submit'])) 
{ 
?> 
<textarea onclick="this.select()" name="output_textarea" id="output_textarea" cols="100" rows="25" readonly value=""> 
<?php 
$numbers = $_POST['numbers']; 
$digits = explode(PHP_EOL.PHP_EOL, $numbers); // Favor PHP_EOL (end of line) to avoid cross OS issues 
foreach($digits as $digit) 
{ 

    $count = array_sum(explode(PHP_EOL, $digit)); 
    echo "sum is $count".PHP_EOL; 
} 
} 
?> 

</textarea> 
</div> 
</body> 
</html> 

PHP FIDDLE SETUP

+0

您是否尝试用简单的旧“\ n”替换PHP_EOL? PHP_EOL是服务器端的EOL,而不是客户端的EOL。 – Dragony

+0

@Dragony:是的,如果我用'“\ n”',它只会回显每个数字 – acr

+0

显然它应该是“\ n \ n”。只是为了确保:) – Dragony

回答

1

我会用preg_split\r?\n

$digits = preg_split('#(\r?\n){2,}#',$numbers); //2 or more \r\n (\r optional) 
foreach($digits as $key => $digit) 
{ 

    $count = array_sum(preg_split('#\r?\n#', $digit)); 
    echo "sum is $count".PHP_EOL; 
    if($key < count($digits)-1) echo '<br />'; 
} 

输出:

sum is 3 
sum is 7 
+0

:谢谢,它工作。如果我想在每个最终输出之间添加一个空格,我该如何添加它?我的意思是'总和3'和'总和7'之间的单行距离。我尝试在'foreach'函数后面添加一个echo'“
”'',但是它在开头也增加了额外的空间。我不想在开始时添加空格,而是在每组输出之间添加空格 – acr

+0

@acr See my更新的答案 - 现在每增加一个(
)'后面的(除了最后一个) – SmokeyPHP

0
$numbers = $_POST['numbers']; 

$digits = explode("\n", $numbers); // explode by next line 
$sums = array(); // array to put sums in 
$i = 0; 
foreach($digits as $digit) { 
    $digit = trim($digit); // remove next line 

    if(is_numeric($digit)) 
     $sums[$i] += $digit; // sum up 
    else 
     $i++; // next index (row wasn't number) 
} 

print_r($sums); 

// Output: Array ([0] => 3 [1] => 7) 
0

使用使preg_split是比较合适的,虽然新生产线可能是在不同的操作系统不同。我的解决方案:

function split_new_lines($string){ 
    return preg_split('/\R/', $string); 
} 

$input = " 
1 
2 

3 
4 

5 
"; 

$lines = split_new_lines($input); 

$sums = array(); 
$sum = null; 
foreach($lines as $line){ 
    $line = trim($line); 
    if(is_numeric($line)) 
    { 
     if($sum === null) 
      $sum = (int)$line; 
     else 
      $sum += (int)$line; 
    } 
    else 
    { 
     if($sum !== null) 
      $sums[] = $sum; 
     $sum = null; 
    } 
} 
if($sum !== null) 
    $sums[] = $sum; 
0

注意PHP_EOL is used to find the newline character in a cross-platform-compatible way。我已经在windows/php 5.4.3上测试过你的代码,它的工作方式如上所述。当我跑你的小提琴时,我得到了错误。

your code output