PHPの組込み関数fgets()およびfile()では、読み込んだテキストファイルの改行を自動で認識して一行ずつ取得することが出来ます。
しかし、実はこれらの関数が認識できる改行コードはLF(\n)のみです。
改行コードがLF(\n)またはCRLF(\r\n)なら問題ないのですが、Macで作成したファイルなどで改行コードがCR(\r)の場合は改行が認識できず全てが一行として取り込まれてしまいます。
解決策
LF意外の改行コードを認識できるようにするためには、php.iniで
auto_detect_line_endings = on
を設定しておけばよいです。
これを設定しておくと、fgets()およびfile()によって読み込まれたデータを評価し、CR、LF、CRLFのどの改行コードが使用されているかを自動で判別してくれるようになります。
若干の性能劣化があることと過去バージョンとの互換性維持のために、デフォルトではオフになっているようです。また、この設定オプションは、PHP 4.3で追加された機能です。それより前のバージョンのPHPでは動作しませんのでご注意ください。
余談ですが、fgets()で読み込んだ一行分の文字列には、末尾に改行コードが残っています。読み込んだ文字列の末尾から改行を取り除くには、rtrim()関数が便利です。