Взорвать содержимое текстового файла в массив

У меня проблемы со взрывом содержимого файла .txt (структура ниже):

    01Name 1 
    02whatever contents
    03whatever contents
    -------------------
    01Name 2
    02whatever contents
    03whatever contents

Как видите, "разделитель" - "-------------------". Теперь возникает вопрос: как разбить этот файл на массив, чтобы я мог искать определенное имя и отображать содержимое этого блока? Я пытался взорваться так:

  header("Content-type:text/plain");
  $file = fopen("cc/cc.txt", "r");


  while (!feof($file)) {
    $lot = fgets($file);
    $chunk = explode("-------------------",$lot);

    print_r($chunk);

  }

  fclose($file);             

И получил это в результате:

    Array
    (
        [0] => 01Name 1 

    )
    Array
    (
        [0] => 02whatever contents

    )
    Array
    (
        [0] => 03whatever contents

    )
    Array
    (
        [0] => -------------------

    )
    Array
    (
        [0] => 01Name 2

    )
    Array
    (
        [0] => 02whatever contents

    )
    Array
    (
        [0] => 03whatever contents
    )        

когда я хотел получить это в результате:

    Array
    (
        [0] => 01Name 1
        [1] => 02whatever contents
        [2] => 03whatever contents

    )
    Array
    (
        [0] => 01Name 2
        [1] => 02whatever contents
        [2] => 03whatever contents
    )

Я искал PHP; назначение вывода fgets() массиву и Прочитать каждую строку текстового файла в новый элемент массива , но безуспешно.

Есть предположения?


person MrsSammartino    schedule 03.10.2012    source источник
comment
вы не можете взорвать текстовый файл, вы можете взорвать содержимое текстового файла ...   -  person Mr. Alien    schedule 03.10.2012
comment
хорошо .. отредактировал мой вопрос!   -  person MrsSammartino    schedule 03.10.2012


Ответы (3)


Вы можете использовать следующие

$result = array();
$file = explode("-------------------", file_get_contents("cc/cc.txt"));
foreach ( $file as $content ) {
    $result[] = array_filter(array_map("trim", explode("\n", $content)));
}
var_dump($result);

Выход

array
  0 => 
    array
      0 => string '01Name 1' (length=8)
      1 => string '02whatever contents' (length=19)
      2 => string '03whatever contents' (length=19)
  1 => 
    array
      1 => string '01Name 2' (length=8)
      2 => string '02whatever contents' (length=19)
      3 => string '03whatever contents' (length=19)

Вы можете пойти дальше

$result = array();
$file = explode("-------------------", file_get_contents("cc/cc.txt"));
foreach ( $file as $content ) 
{
    foreach(array_filter(array_map("trim",explode("\n", $content))) as $line)
    {
        list($key,$value) = explode(" ", $line);
        $result[$key] = $value ;
    }
}
var_dump($result);

Выход

array
  '01Name' => string '2' (length=1)
  '02whatever' => string 'contents' (length=8)
  '03whatever' => string 'contents' (length=8)
person Baba    schedule 03.10.2012
comment
Ваш первый вариант помог! Теперь это просто вопрос перебора массивов... Спасибо!!! - person MrsSammartino; 03.10.2012
comment
Добро пожаловать, я вижу, вы новичок. Вы также должны принять см.: meta.stackexchange.com /вопросы/16721/ - person Baba; 03.10.2012
comment
Вы приняли другой ответ, не мой... вы можете принять только один ответ за раз - person Baba; 03.10.2012
comment
Спасибо, я очень ценю @MrsSammartino - person Baba; 03.10.2012

Во-первых, вы должны использовать file() для чтения и разделения файла по строкам. Это встроенный модуль специально для этой цели.

Ваша проверка на "-------------------" не удалась, потому что вы не учли конечные разрывы строк (\r\n и т. д.). (Используйте FILE_IGNORE_NEW_LINES для функции file() как одно из решений). Хотя здесь может быть лучше использовать регулярное выражение:

$lines = file($filename);
foreach ($lines as $line) {
    if (preg_match('/^\s*---------+\R*$/', $line)) { ... }
}

Это немного избыточно, но более устойчиво.

Вы также можете прочитать весь файл с помощью file_get_contents и разделить текстовые блоки с помощью preg_split вместо этого.

person mario    schedule 03.10.2012
comment
Preg_split в этом случае не применяется... в остальном он отлично работает! Спасибо! - person MrsSammartino; 03.10.2012

Если ваш файл последовательно отформатирован, имея три строки на блок данных, вы можете просто разобрать его таким образом. Здесь я создаю двумерный массив всего файла:

<?php

header("Content-type:text/plain");
$file = fopen("cc.txt", "r");

$alldata = array();
$index = 0;
while (!feof($file))
{
    $alldata[$index]['name'] = fgets($file);
    $alldata[$index]['c1'] = fgets($file);
    $alldata[$index]['c2'] = fgets($file);
    fgets($file); // throw away delimiter line
    $index++;
}
fclose($file);  

print_r($alldata);
?>

Это выводит:

Array
(
    [0] => Array
        (
            [name] => 01Name 1 
            [c1] => 02whatever contents
            [c2] => 03whatever contents
        )
    [1] => Array
        (
            [name] => 01Name 2
            [c1] => 02whatever contents
            [c2] => 03whatever contents
        )
)
person JYelton    schedule 03.10.2012
comment
К сожалению, я только что отредактировал свой текстовый файл для удобочитаемости... фактический текстовый файл имеет прибл. 2800 строк... и количество строк несовместимо в каждом блоке.. - person MrsSammartino; 03.10.2012