php цикл foreach со счетчиком для предотвращения эха первой и последней строк - PullRequest
1 голос
/ 06 января 2012

Я пытаюсь сделать небольшой скрипт для манипулирования txt-файлом с заданным содержимым файла каталога.Что происходит, так это то, что в текстовом файле, сгенерированном путем перехода к командной строке Win и выполнения "dir> file.txt", есть строки, которые являются ненужными для этого пурпурного ... как первые 7 строк и последние 3. Эти:

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 игнорировать последнийстроки текстового файла тоже?

Ответы [ 7 ]

4 голосов
/ 06 января 2012

Вам, вероятно, следует использовать scandir() или эквивалентные функции PHP, специально предназначенные для этого.

Однако, если вы настаиваете, вы можете нарезать массив, используя array_slice().Следующее удалит две первую и последнюю строки.

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

В качестве альтернативы, вы можете просто перебрать нужную часть с помощью цикла for вместо цикла foreach.

$files = (count($output)-2);
for ($file=7; $file < $files; $file++)
  $newstring = substr($output[$file, 36);
  echo "File: " . $newstring . "<br />"; 
}
1 голос
/ 06 января 2012

Я бы сохранил все строки в массиве, скомбинировал нужные вам строки и затем повторил все это.

//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;
}  
1 голос
/ 06 января 2012

попробуйте это:

$lastLine=count($output)-3;
for($i=7; $i<$lastLine; $i++) {
    $newstring = substr($var, 36);
    echo "File: " . $newstring . "<br />"; 
} 
1 голос
/ 06 января 2012

Вы можете изменить свой код вокруг оператора if, чтобы он выглядел следующим образом:

$total = count($output) - 3;
if($i > 7 && $i < $total) {
1 голос
/ 06 января 2012

Используйте array_slice () , чтобы разделить массив $ output до нужных записей перед циклом.

1 голос
/ 06 января 2012

Полагаю, вы могли бы сделать что-то вроде этого:

$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 () и таким образом проанализировать содержимое каталога.

0 голосов
/ 06 января 2012

также вы можете получить список файлов указанной директории с помощью php кода http://www.php.net/manual/en/class.dir.php.

...