2015-12-02 91 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 

,它會工作的時候,你期望的那樣。