【问题标题】:help using php explode () and organizing output帮助使用 php explode() 和组织输出
【发布时间】:2011-03-30 04:46:49
【问题描述】:

有人可以告诉我如何正确映射吗?我正在尝试了解如何使用 php explode() 并以一种我可以检索并以某种有组织的方式打印它们的方式组织这些值。对于每条记录,我想将 name=value 放在特定的存储桶中。每条记录我有 (7) 个最大存储桶。有时我的记录不会填满每个存储桶。

(例如记录 (2) 缺少属性 (5,6,7),记录 (3) 缺少属性 (4))。

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);
}
?>

我想为每个属性打印出相似的值,而不是混合在一起。 使用'打印 $pieces[3];'

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

【问题讨论】:

  • 你期待什么输出?
  • 嗨 timdev,我希望每一列 (1-7) 都充当表的标题,然后值将是行。如果我们缺少第 4 列、第 5 列或第 6 列,它将打印为空单元格或空白单元格。我希望这是有道理的。想象一下这个数据在一个简单的表中。谢谢。

标签: php multidimensional-array explode


【解决方案1】:

看看这是否有帮助...

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

这将为您提供一个键为 1-Column、2-Column 的数组,依此类推,它将包含一个相关值的数组。你可以用任何你想要的方式打印这个数组。

这是输出:

[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
    )

【讨论】:

  • 谢谢@aadravid。 'data' 是我的 $Inputfile 吗?如何传入文本文件?谢谢。
  • 您的数据可以是任何东西...只需将 $_POST['data'] 替换为您已将数据读入的变量即可。您可以按照 timdev 的建议使用 file("test.txt") 来读取您的文件。
  • 您的贪婪量词 (.*) 将导致第一个匹配项也匹配整个字符串的其余部分。当我们这样做时,最好也摆脱惰性量词。最好使用否定字符类 /([^=]*)=([^;]*)/
  • 好的...我刚刚开始学习正则表达式,所以这会有所帮助...感谢蜡笔暴力的提示。
【解决方案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
)

【讨论】:

  • 这很酷。谢谢! preg_match 似乎更合适。这正是我所设想的。
  • 如果我想删除每列的数字前缀怎么办?从“1 列”->“列”、“2 列”->“列”。我们可以坚持使用 preg_match 吗?谢谢。
  • 是的。可以将 n- 移出捕获的组(将其放在自己的非捕获可选组中) preg_match('~(?:1-)?(Column[^;]*;?)?(?:2- )?(Column[^;]*)?;?(?:3-)?(Column[^;]*)?;?(?:4-)?(Column[^;]*)?;?( ?:5-)?(Column[^;]*)?;?(?:6-)?(Column[^;]*)?;?(?:7-)?(Column[^;]*) ?;?~',$line,$pieces);
【解决方案3】:

虽然不清楚您要完成什么,但希望这段代码可以帮助您弄清楚发生了什么。

请注意,在这里,我在主 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 更改为   或其他内容。

【讨论】:

    【解决方案4】:

    如果您的输入数据非常不规则,您可能需要使用更多代码来解析它,而不仅仅是简单的分解,或者准备它以使其按预期与分解一起工作。

    在第二种情况下,您可以使用strpos 查找所有“;”字符串中的字符并检查它们后面的数字是否有序。如果一个(或多个)数字被跳过,您应该通过插入另一个“;”来补偿。这种方式 explode 将创建一个空数组元素,并且所有生成的数组都应该对齐。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多