2012-01-06 10 views
1

私は、特定のディレクトリファイルの内容でtxtファイルを操作するための小さなスクリプトを作ろうとしています。何が起こるのは、Winのコマンドラインに行き、 "dir> file.txt"を実行することによって生成されたテキストファイルが、最初の7行と最後の3のようにこのひどいところに迷惑な行を持っているということです。これらは:php最初の行と最後の行のエコーを防ぐためのカウンタforeachサイクル

O volume na unidade C nao tem nome. 
O numero de serie do volume - F879-0704 

Directorio de C:\xampp\htdocs\projectX\images\ 

06-01-2012 14:56 <DIR>   . 
06-01-2012 14:56 <DIR>   .. 
. 
. 
. 
140 ficheiro(s)  5.676.057 bytes 
2 dir(s)  307.888.893.952 bytes livres 

私がこれまで持っているコードは、このです:

$file = $_GET['file']; 
$fp = fopen($file, "r"); 
$data = fread($fp, filesize($file)); 
fclose($fp); 

$end = 0; 
$i = 0; 

while($end != 1) { 

$output = str_replace("\t|\t", " | ", $data); 
$output = explode("\n", $output); 

foreach($output as $var) { 
    if($i > 7){ 
     $newstring = substr($var, 36); 
     echo "File: " . $newstring . "<br />"; 
    } 
    $i++; 
}  
echo "<br /><strong>End of file list!</strong>"; 
$end = 1; 

}

は私の質問:は、どのように私はこのforeachのサイクルがあまりにもテキストファイルの最後の行を無視するように得ることができますか?

+3

特定の行番号を無視するよりも直観的なものを作成する方がよいでしょう。それは脆い。代わりに、あなたが気にする行に一致するロジックを構築してください(つまり、文字列または正規表現のマッチング) –

+0

ディレクトリ内のすべてのファイルを取得しようとしているようです。そうであれば、もっと良い方法があります。最も基本的な形式は次のとおりです:http://php.net/manual/en/function.readdir.php – hoppa

+3

PHPが['scandir()'](http ://php.net/scandir)? – kba

答えて

4

おそらく、特にこのために作られていscandir()または同等のPHPの関数を使用する必要があります。

しかし、あなたが言うならば、array_slice()を使って配列をスライスすることができます。次の行は、最初と最後の2行を削除します。

$output = array_slice($output, 2, count($output) - 4); 

代わりに、あなただけの代わりにforeachループのforループにしたい部分を反復処理できます。

$files = (count($output)-2); 
for ($file=7; $file < $files; $file++) 
    $newstring = substr($output[$file, 36); 
    echo "File: " . $newstring . "<br />"; 
} 
+2

あなたは今すぐ解決した解決策です!そして私はあなたの提案に従い、自由な時間があればscandir()を使用します。私は機能が存在していることを完全に忘れてしまった!どのようなばかげたばか! :)とにかく、私はこれのためにStackOverflowを正確に愛し、私たちは愚かな質問をすることから多くを学ぶことができます!ありがとう、ありがとう、すばらしい提案がありました。乾杯 –

1

は、私はあなたがこのような何かを行うことができたとします

$total = count($output); 
foreach($output as $var) { 
    if ($i > 7 && $i < $total - 1) { 
     $newstring = substr($var, 36); 
     echo "File: ".$newstring."<br />"; 
    } 
    $i++; 
} 

は、私は質問のコメントで@Jason McCrearyに同意する、しかし。これは洗練されたソリューションに近いものではありません。しかし、それはあなたの正確な状況のために行います。また、テキストファイルから作業する必要がない場合は、opendir()関数のコード例に従って、そのようにディレクトリの内容を解析することもできます。

+1

あなたは&&と||の代わりに使いたいですまたは – Jimmery

+1

@ジミー:シュート、ええ、あなたが正しいです。私はそれを修正します。 – Crontab

1

array_slice()を使用して、$出力配列をループする前に必要なエントリだけに切り詰めます。

1

あなたはこのように見えるようにif声明の周りにあなたのコードを変更することができます。

$total = count($output) - 3; 
if($i > 7 && $i < $total) { 
+2

ループの各反復で呼び出しカウントが少し不十分です – Jimmery

+1

あなたは正しいです。 if文でもエラーがあったので、私はそれを修正しました。 –

1

はこれを試してみてください。

$lastLine=count($output)-3; 
for($i=7; $i<$lastLine; $i++) { 
    $newstring = substr($var, 36); 
    echo "File: " . $newstring . "<br />"; 
} 
+0

このコードでは、必要がなくても最後の行を繰り返し処理します。それは単なる余計な作業です。代わりに、最初に 'if($ i <($ lastLine-3))break;'を追加してください。あるいは単にforループを使用してください。 – kba

+0

はい。 foreachループよりもforループを考える方が適切です。それに応じて私のコードを調整してください。 – Jimmery

1

私はすべての行を配列に格納し、必要な行をスプライスして、それをすべてエコーします。

//ADD FILE LINES TO ARRAY 
foreach($output as $var) { 
    $file_lines[] = substr($var, 36)."\n"; 
} 

//SPLICE OUT LINES NEEDED 
$newlines = array_splice($file_lines, 7, count($file_lines)-3); 

//ECHO DATA 
foreach($newlines as $line) { 
    echo $line; 
} 
関連する問題