2015-12-02 142 views
1

我试图找到使用php的文件中每行的最大值。我的输入看起来像这样。php max()函数给出错误结果

1x5x10 
1x10x5 
5x1x10 
5x10x1 
10x1x5 
10x5x1 

我的代码:

<?php 

$myfile = fopen("day2_input.txt", "r") or die("Unable to open file!"); 

while(!feof($myfile)) { 
    $line = fgets($myfile); 

    $lineArr = explode("x", $line); 

    echo(max($lineArr)."\n"); 
} 

fclose($myfile); 

?> 

这里是奇怪的事情。当你在输入看到,每一行的最大值是10,但这里是我的输出:

5 
5 

5 
10 
5 

10 

包括在最后一个空行。两个问题。为什么max()-函数会给10以外的东西?为什么输出中的空行?输入文件末尾没有空格。我也checkd使用print_r()阵列上$lineArr这给:

Array 
(
    [0] => 1 
    [1] => 5 
    [2] => 10 

) 
Array 
(
    [0] => 1 
    [1] => 10 
    [2] => 5 

) 
Array 
(
    [0] => 5 
    [1] => 1 
    [2] => 10 

) 
Array 
(
    [0] => 5 
    [1] => 10 
    [2] => 1 

) 
Array 
(
    [0] => 10 
    [1] => 1 
    [2] => 5 

) 
Array 
(
    [0] => 10 
    [1] => 5 
    [2] => 1 
) 

回答

3

您的爆炸正在创建一个字符串数组,而不是整数....所以max应用了字符串比较逻辑,并且10按字母顺序小于5

您的字符串元素转换为整数,然后做最大()调用....类似:

$lineArr = array_map('intval', explode("x", $line)); 
+0

@BluePrint - 马克贝克打我3秒 - 请接受他的回答:) – markdwhite

4

他们被转换为字符串,并正在字母数字比较。做一个后续代码var_dump($ lineArr),而不是一的print_r($ lineArr)证实了这一点:

http://php.net/manual/en/function.max.php

“多字符串值将字母数字比较”

用途:

$lineArr = array_map('intval', explode('x', $line)); 
0

正如你可以在$lineArr输出看到,在第三换行符每个爆炸结果的元素。你必须爆炸前从源头上线修剪换行符,如下所示:

$line = fgets($myfile); 
$line = trim($line, " \t\r\n"); // this string to be added 

,它会工作的时候,你期望的那样。