2012-09-18 34 views
2

我試圖跳過CSV文件中的前幾行。在其餘的行中,第一列是一個序數-1,2,3等。但由於某種原因,使用is_numeric完全失敗。我認爲這可能是引號,但手冊中的測試數組已引用並正確輸出答案。PHP is_numeric不適用於數組值

開檢查$å文件後...

while (($row = fgetcsv($afile)) !== FALSE) { 
     // first three rows don't have numbers in first column 
     if (is_numeric($row[0])) 
      print "<tr><td>{$row[7]}</td></tr>"; 
     else 
      print "not numeric: {$row[0]}<br/>"; 
    } 

一切都爲 「不是數字」!

當我print_r的陣列,還有報價在列,所以我試圖運行str_replace函數來剝去引號和is_numeric 仍然出來作爲虛假的所有的時間...

完全莫名其妙,希望有人能幫助我希望這只是一個愚蠢的問題,「在午夜編碼」 ...

[編輯]

好吧,我懷疑它的東西與數據,但我看不出什麼毛病。當我在BBEdit中「顯示隱形」時,我得到一個在之間的倒數問號,每個字符。請參閱:

Image

所以..這是奇怪的。假設我會一直得到這些不可見的東西,直到我可以找出導出的數據。PHP可以做任何事情來清理數據嗎?也許是一個字符集問題?

[再次編輯]感謝martinstoeckli,我用mb_convert_string轉換了數據,is_numeric現在可以正確返回。

+1

那麼你的數據是什麼樣子? – chovy

+0

而不是'is_numeric'使用'preg_match',因爲fgetcsv讀取字符串值作爲字符串 – Poonam

+0

Poonam,是的,似乎工作,但爲什麼*不*數字工作?它應該將帶有引號的數字看作數字,對嗎? – jendotm

回答

1

也許它可以幫助:

settype($row[0], "int"); 
2

一個非常簡單的替代is_numeric是檢查,如果你檢查int值:

if ($row[0] == (string)(int)($row[0])) 

,或者如果你擔心的可能性尾部空格還檢查strlen($row[0]) == strlen((int)$row[0])

0

根據截圖,csv文件是一個UTF-16編碼的Unicode文件。這些文件爲每個字符使用2個字節。如果將內容轉換爲UTF-8,則應該能夠正常處理字符串,當然這將適用於從文件讀取的所有變量(不僅是第一個數字)。

$rowNumber = mb_convert_encoding($row[0],'utf8','utf-16'); 
if (is_numeric($rowNumber)) 
{ 
    ... 
} 
0

我做is_numeric((string)(int)$content);