2

CSV ファイルの最初の数行をスキップしようとしています。残りの行では、最初の列は序数 (1、2、3 など) です。しかし、何らかの理由で、is_numeric を使用すると完全に失敗します。引用符かもしれないと思いましたが、マニュアルのテスト配列には引用符があり、答えが正しく出力されます。

$afileを開いて確認した後...

    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は常にfalseとして表示されます...

完全に困惑しています。誰かが助けてくれることを願っています。それが愚かな「真夜中のコーディング」の問題であることを願っています...

[編集]

データに問題があるのではないかと疑っていましたが、何も問題はありませんでした。BBEdit で「非表示を表示」すると、すべての文字の間に逆さまの疑問符が表示されます。見る:

画像

だから..それは奇妙です。エクスポートされたデータを把握できるようになるまで、これらの目に見えないものを常に取得すると仮定すると.. PHPはデータをきれいにするために何かできますか? 多分文字セットの問題?

[再編集] martinstoeckli のおかげで、データを mb_convert_string で変換すると、is_numeric が正しく返されるようになりました。

4

4 に答える 4

2

is_numeric の非常に簡単な代替方法は、int をチェックしているかどうかを確認することです。

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

または、末尾のスペースの可能性が心配な場合は、次も確認してくださいstrlen($row[0]) == strlen((int)$row[0])

于 2012-09-18T07:58:00.577 に答える
1

多分それは役立ちます:

settype($row[0], "int");
于 2012-09-18T07:48:36.473 に答える
0

スクリーンショットによると、csvファイルはUTF-16エンコーディングのUnicodeファイルです。このようなファイルは、各文字に2バイトを使用します。コンテンツをUTF-8に変換すると、文字列を通常どおりに処理できるはずです。もちろん、これはファイルから読み取られるすべての変数(最初の数値だけでなく)にも適用されます。

$rowNumber = mb_convert_encoding($row[0],'utf8','utf-16');
if (is_numeric($rowNumber))
{
  ...
}
于 2012-09-19T07:12:57.587 に答える
0

そうですis_numeric((string)(int)$content);

于 2015-01-05T11:20:38.340 に答える