2010-08-15 55 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