【问题标题】:"If" doesn´t work - weird string formatting“如果”不起作用 - 奇怪的字符串格式
【发布时间】:2016-06-07 12:38:21
【问题描述】:

我在数据处理方面遇到了奇怪的问题。我需要从用户表单中挑选数据,并处理它(生成 xml)。 数据例如是这样的:

2000;AC;1;60;5;5;进行设置 - 表示电压、电压类型、测试电流、测试时间、加速时间、减速时间和用户提示。

我想根据最后一个值决定如何组装我的 xml 文件。如果为零,则会有较短的xml组装,而当有文本时,则会有xml标记的用户提示组装。

所以我将输入分解为数组,并通过以下方式检查值:

If (empty($xplodline[6]) == true) {do this;}
else {do that;}

问题是,它总是只做“那个”,而不是“这个”,即使 $xplodline[6] 中的值是 0 也是如此。

所以我把 echo $xplodline[6];进入 {do that;} 看看发生了什么。 回显零,(当这个动作在循环中时,我从循环中得到其他 $xplodline[6]s),我看到 $xplodline[6] 和下一个 $xplodline 中的零之间有一个空格[6] 迭代。当我使用这些值查看用户表单或临时清理文件时,之间没有空格。哪里来的?

当我将另一个数组分隔符放入用户表单以使其成为 ;0;没有空格,If 语句运行良好。

这是临时清理文件中的原始数据:

2000;AC;1;60;5;5;0
2000;AC;1;60;5;5;Set your cables for X10
2000;AC;1;60;5;5;Set your cables for X10 

有什么想法吗?

好的,代码如下:

$stringer = fopen($tempfile, "r");
while(!feof($stringer)){
$oneline = fgets($stringer) ;
$xplodline = explode(";",$oneline) ;
$range01 = "gross" ;
$rampup = "100" ;
$rampdown = "100" ;
$rampupfunction = "false" ;
$rampdownfunction = "false" ;
$currentrange = "_1mA" ;
$assy01 = "1" ;
if ($xplodline[0] >= 3000) {$range01 = "gross" ;}
else {$range01 = "klein" ;}
if (empty($xplodline[4]) == false) {$rampupfunction = "true" ; $rampup = round($xplodline[0] / $xplodline[4]) ;}
if (empty($xplodline[5]) == false) {$rampdownfunction = "true" ;$rampdown = round($xplodline[0] / $xplodline[5]) ;}
if ($xplodline[2] < 1) {$currentrange = "_1mA";}
if ($xplodline[2] >= 1 && $xplodline[2] < 10) {$currentrange = "_10mA";}
if ($xplodline[2] >= 10 && $xplodline[2] < 100) {$currentrange = "_100mA";}
if (empty($xplodline[6]) == true) {$assy01 = $xmltestbegin.$xplodline[0]."V ".$xplodline[1].$xmltype.$xplodline[1].$xmlrange.$range01.$xmlrampup.$rampupfunction.$xmlrampdown.$rampdownfunction.$xmlcurrentrange.$currentrange.$xmlvoltage.$xplodline[0].$xmlrampupspeed.$rampup.$xmlrampdownspeed.$rampdown.$xmltesttime.$xplodline[3].$xmlcurrent.$xplodline[2].$xmlballast ;}
else {$assy01 = $xmlpromptbegin.$xplodline[6].$xmlpromptend.$xmltestbegin.$xplodline[0]."V ".$xplodline[1].$xmltype.$xplodline[1].$xmlrange.$range01.$xmlrampup.$rampupfunction.$xmlrampdown.$rampdownfunction.$xmlcurrentrange.$currentrange.$xmlvoltage.$xplodline[0].$xmlrampupspeed.$rampup.$xmlrampdownspeed.$rampdown.$xmltesttime.$xplodline[3].$xmlcurrent.$xplodline[2].$xmlballast ;}
file_put_contents ( $filename, $assy01, FILE_APPEND );  
}
fclose($stringer);

我的函数工作正常,除了最后一个之外,每个 If 都可以工作......

【问题讨论】:

  • 文本太多,代码太少......
  • @apokryfos 0 为空。 php.net/manual/en/function.empty.phpThe following things are considered to be empty:..."0" (0 as a string).
  • 请提供一个可重现的例子。 eval.in/584631
  • @chris85 你是对的,尽管当涉及尾随空格时它仍然是一个悲伤的来源。
  • 是的,var_dumping $xplodline[6] 可能很有用。

标签: php xml formatting


【解决方案1】:

来自http://php.net/manual/en/function.fgets.php

当读取到 length - 1 个字节、换行符(包含在返回值中)或 EOF(以先到者为准)时,读取结束。如果没有指定长度,它将继续从流中读取,直到到达行尾。

简而言之,在您的最后一个数组条目中总会有一个换行符。通过做清理它

$oneline = rtrim(fgets($stringer));

你也可以考虑:

$stringer = fopen($tempfile, "r");
while(!feof($stringer)){
    $xplodline = fgetcsv($stringer,0,";"); 
    //Rest of code as normal

这将使 PHP 将文件作为 CSV 样式文件处理。

【讨论】:

    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多