2012-10-03 48 views
3

I'm具有麻煩爆炸.txt文件的內容(下面結構):爆炸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; assigning fgets() output to an arrayRead each line of txt file to new array element,沒有運氣。

有什麼想法?

+1

你不能爆炸一個txt文件,你可以爆炸的txt文件的內容...... –

+0

確定..編輯我的問題! – MrsSammartino

回答

4

您可以使用以下

$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) 
+0

您的第一個選擇做到了!現在只是通過數組循環的問題...謝謝! – MrsSammartino

+0

不客氣,我可以看到你是新的。你也應該接受看到:http://meta.stackexchange.com/questions/16721/how-does-accept-rate-work – Baba

+0

完成,巴巴! :) – MrsSammartino

0

首先,您應該使用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來代替文本塊。

+0

Preg_split不適用於這種情況..除此之外,它工作正常!謝謝! – MrsSammartino

0

如果你的文件格式一致,每塊數據有三行,你可以簡單地解析它。在這裏,我創建了整個文件的2維數組:

<?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 
     ) 
) 
+0

不幸的是,我只是編輯我的txt文件的可讀性...實際的文本文件有約。 2800行......並且每行的行數不一致.. – MrsSammartino

0
$c  = file_get_contents($file); 
$lines = explode("-------------------", $c); 
foreach ($lines as $l) { 
    if (strpos($l, 'keyword') !== false) { 
     echo $l; 
     die(); 
    } 
} 
+0

也適用!謝謝! – MrsSammartino