2010-08-15 53 views
0

有人可以告訴我如何正確映射這個嗎?我試圖瞭解如何使用php explode()並以某種方式組織這些值,以便我可以在某些有組織的事情中檢索和打印這些值。對於每個記錄,我想在特定的桶中放入一個名稱=值。我有(7)每記錄最大桶。有時我擁有不會填滿每個存儲桶的記錄。 (例如,記錄(2)缺少屬性(5,6,7),記錄(3)缺少屬性(4))。幫助使用PHP爆炸()和組織輸出

1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=db9.nfl.colo2.;4-Column=00:00:03;5-Column=01:55:02;6-Column=87.24 MB;7-Column=Success; 
1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=pdb2.colo2.;4-Column=04:00:02; 
1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=gl3_lvm;5-Column=04:48:06;6-Column=54.64 MB;7-Column=Success; 

到目前爲止,我寫了這個,查看我的輸出:

<?php 
$InputFile = file("test.txt"); 
foreach ($InputFile as $line){ 
    $pieces = explode(";", $line); 
     //print $pieces[0]; 
     //print $pieces[1]; 
     //print $pieces[2]; 
     print $pieces[3]; 
     //print $pieces[4]; 
     //print $pieces[5]; 
     //print $pieces[6]; 
//print_r($line); 
} 
?> 

我想打印出相同的價值每個屬性,而不是這其中的混合。 使用'print $ pieces [3];''

4-Column=00:00:034-Column=04:00:025-Column=04:48:06 
+0

你期待什麼輸出? – timdev 2010-08-15 21:59:11

+0

嗨timdev,我希望每個列(1-7)作爲表頭的標題,然後值將是行。如果我們缺少第4列或第5或第6列,它將打印出空白或空白的單元格。我希望這是有道理的。把這些數據想象成一張簡單的表格。謝謝。 – cjd143SD 2010-08-15 22:09:59

回答

2
$InputFile = file("test.txt"); 
foreach ($InputFile as $line){ 
    preg_match('~(1-Column[^;]*;?)?(2-Column[^;]*)?;?(3-Column[^;]*)?;?(4-Column[^;]*)?;?(5-Column[^;]*)?;?(6-Column[^;]*)?;?(7-Column[^;]*)?;?~',$line,$pieces); 
    $pieces = array_pad($pieces,8,''); 
    echo "<pre>";print_r($pieces);echo "</pre>"; 

} 

輸出:

Array 
(
    [0] => 1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=db9.nfl.colo2.;4-Column=00:00:03;5-Column=01:55:02;6-Column=87.24 MB;7-Column=Success; 
    [1] => 1-Column=host1.colo.sub; 
    [2] => 2-Column=Fri Aug 13 
    [3] => 3-Column=db9.nfl.colo2. 
    [4] => 4-Column=00:00:03 
    [5] => 5-Column=01:55:02 
    [6] => 6-Column=87.24 MB 
    [7] => 7-Column=Success 
) 

Array 
(
    [0] => 1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=pdb2.colo2.;4-Column=04:00:02; 
    [1] => 1-Column=host1.colo.sub; 
    [2] => 2-Column=Fri Aug 13 
    [3] => 3-Column=pdb2.colo2. 
    [4] => 4-Column=04:00:02 
    [5] => 
    [6] => 
    [7] => 
) 

Array 
(
    [0] => 1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=gl3_lvm;5-Column=04:48:06;6-Column=54.64 MB;7-Column=Success; 
    [1] => 1-Column=host1.colo.sub; 
    [2] => 2-Column=Fri Aug 13 
    [3] => 3-Column=gl3_lvm 
    [4] => 
    [5] => 5-Column=04:48:06 
    [6] => 6-Column=54.64 MB 
    [7] => 7-Column=Success 
) 
+0

這很酷。謝謝! preg_match似乎更適合。這正是我所設想的。 – cjd143SD 2010-08-15 23:02:45

+0

如果我想刪除每列的號碼前綴,該怎麼辦?從'1欄' - >'欄','2欄' - >'欄'。我們能堅持preg_match嗎?謝謝。 – cjd143SD 2010-08-15 23:16:52

+0

是。 preg_match('〜(?:1 - )?(Column [^;] *;?)?(?:2- )(柱[^] *);????(?:3 - )(柱[^] *);?????(?:4 - )(柱[^] *);( ?:???????5 - )(柱[^] *);(?: 6 - )(柱[^] *);(?: 7 - )(柱[^] *) ?;?〜」,$線,$件); – 2010-08-15 23:27:31

0

如果輸入的數據是如此的不規則,你要麼需要更多的代碼來解析它,不只是一個簡單的爆炸,或使其按預期工作與爆炸做好準備。

在第二種情況下,您可以使用strpos查找所有「;」字符串中的字符並檢查它們後面的數字是否正確。如果一個(或更多)號碼被跳過,您應該通過插入另一個「;」來進行補償。這種方式爆炸將創建一個空的數組元素,所有你的結果數組應該對齊。

0

雖然它不完全清楚你想要完成什麼,但希望這段代碼能幫助你弄清楚發生了什麼。

注意,在這裏,我已經添加了主要的foreach內另一個循環,遍歷該行的每個名稱/值對:

<?php 
$InputFile = file("test.txt"); 
$lineCnt = 0; 
foreach ($InputFile as $line){ 
    $lineCnt++; 
    echo "Processing line #" . $lineCnt. "\n"; 
    $pieces = explode(";", $line); 
    foreach($pieces as $pair){ 
    $pair = explode('=',$pair); 
     if (!empty($pair[1])){ 
      print "\t".$pair[0] .' = ' . $pair[1] . "\n"; 
     } 
    } 

} 

如果從運行該腳本會產生好看的輸出命令行。如果您在瀏覽器中運行它,則可能需要將\ n改爲
,將\ t改爲 或其他。

0

看看這有助於...

$splits = explode(';',$_POST['data']); 
foreach($splits as $id => $item) { 
    preg_match('/(.*?)=(.*)/',$item, $matches); 
    $parts[$matches[1]][] = $matches[2]; 
} 
print_r($parts); 

這會給你的鑰匙爲1列,2柱爲等這將包含相關值的數組的數組。你可以用任何你想要的方式打印這個數組。

這裏是輸出:

[1-Column] => Array 
    (
     [0] => host1.colo.sub 
     [1] => host1.colo.sub 
     [2] => host1.colo.sub 
    ) 

[2-Column] => Array 
    (
     [0] => Fri Aug 13 
     [1] => Fri Aug 13 
     [2] => Fri Aug 13 
    ) 

[3-Column] => Array 
    (
     [0] => db9.nfl.colo2. 
     [1] => pdb2.colo2. 
     [2] => gl3_lvm 
    ) 

[4-Column] => Array 
    (
     [0] => 00:00:03 
     [1] => 04:00:02 
    ) 

[5-Column] => Array 
    (
     [0] => 01:55:02 
     [1] => 04:48:06 
    ) 

[6-Column] => Array 
    (
     [0] => 87.24 MB 
     [1] => 54.64 MB 
    ) 

[7-Column] => Array 
    (
     [0] => Success 
     [1] => Success 
    ) 
+0

謝謝@aadravid。 'data'是我的$ Inputfile嗎?我如何傳入文本文件?謝謝。 – cjd143SD 2010-08-15 22:36:36

+0

你的數據可以是任何東西......只要用你讀取數據的變量替換$ _POST ['data']即可。您可以使用timdev建議的file(「test.txt」)來讀取您的文件。 – 2010-08-15 22:43:27

+0

你的貪婪量詞(。*)會導致第一個匹配匹配整個字符串的其餘部分。儘管我們處於這種狀態,但最好還是擺脫懶惰的量詞。更好地使用負面字符類/([^ =] *)=([^;] *)/ – 2010-08-15 22:51:36