帮助preg_match_all并创建默认值

时间:2011-01-11 06:17:13

标签: php preg-match-all

我需要php帮助/专业知识来调整/更改这个preg_match_all函数。我想要做的是为缺少的有序对创建默认值。它正确匹配数据,但我需要一些逻辑来添加一些默认值。 (参见下面的EXPECTING数据输出)。这可以在同一个功能中处理吗?谢谢!

preg_match_all摘录:

foreach ($InputFile as $line){
    preg_match_all("/([0-9])-([^=]+)=([^;]+);/", $line, $matches, PREG_SET_ORDER);
    $LineData = array();
    foreach ($matches as $information)
        $LineData[$information[2]] = $information[3];
    $data[] = $LineData;
print_r($LineData);
}

数据文件的顺序最多为(8)个:

1-Server
2-Logdate
3-BackupSet
4-StartTime
5-Duration
6-DBServer
7-Size
8-Status

但是文件中有实例,其中有些行没有所有属性,例如5-Duration,7-Size,8-Status。我想为这些属性设置一个默认值,如:

5-Duration => 0
7-Size     => 0
8-Status   => incomplete

数组输出:(当前)

Array ( [Server] => hostname3.prop.abc
        [Logdate] => Wed Jan 05 2011
        [BackupSet] => rfoo101.az1
        [StartTime] => 20110105000004
        [Duration] => 00:56:47
        [DBServer] => rfoo101.prop.az1.kaz.com 
        [Size] => 56.51
        [Status] => Backup succeeded )
Array ( [Server] => hostname3.prop.abc
        [Logdate] => Wed Jan 05 2011
        [BackupSet] => bar202.az4_lvm
        [StartTime] => 20110105040003
        [DBServer] => bar202.prop.az4.kaz.com) 
Array ( [Server] => hostname10.prop.az2
        [Logdate] => Thu Jan 06 2011
        [BackupSet] => bar201_az2_lvm
        [StartTime] => 20110106151622
        [DBServer] => bar201.prop.az2.kaz.com  
        [Status] => Backup failed )

期待数据输出:(具有默认值)

Array ( [Server] => hostname3.prop.abc
        [Logdate] => Wed Jan 05 2011
        [BackupSet] => rfoo101.az1
        [StartTime] => 20110105000004
        [Duration] => 00:56:47
        [DBServer] => rfoo101.prop.az1.kaz.com 
        [Size] => 56.51
        [Status] => Backup succeeded )
Array ( [Server] => hostname3.prop.abc
        [Logdate] => Wed Jan 05 2011
        [BackupSet] => bar202.az4_lvm
        [StartTime] => 20110105040003
        [Duration] => 0 
        [DBServer] => bar202.prop.az4.kaz.com 
        [Size]     => 0  
        [Status]   => incomplete) 
Array ( [Server] => hostname10.prop.az2
        [Logdate] => Thu Jan 06 2011
        [BackupSet] => bar201_az2_lvm
        [StartTime] => 20110106151622
        [Duration]  => 0
        [DBServer] => bar201.prop.az2.kaz.com 
        [Size]   => 0 
        [Status] => Backup failed )

每个帮助的代码更改:

<?php
$defaults = array(
    'Duration' => 0,
    'Size'     => 0,
    'Status'   => 'incomplete' );

$data = array();
$InputFile = file("test.txt");

foreach ($InputFile as $line){
    preg_match_all("/([0-9])-([^=]+)=([^;]+);/", $line, $matches, PREG_SET_ORDER); 
    $LineData = array();
    foreach ($matches as $information)                  
        $LineData[$information[2]] = $information[3];  
    $data[] = array_merge($defaults, $LineData);
}

print_r($data);
?>

2 个答案:

答案 0 :(得分:1)

您可以创建一个默认值数组,然后使用array_merge()创建一个具有默认值的输出数组,除非被解析后的匹配值覆盖:

$defaults = array(
    'Duration' => 0,
    'Size' => 0,
    'Status' => 'incomplete' );

$output_with_defaults = array_merge($defaults, $output_without_defaults);

由于array_merge()

的以下行为,此方法有效
  

如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个键。

对于您的情况,您需要修改此行:

$data[] = $LineData;

是...

$data[] = array_merge($defaults, $LineData);

(并在任何当前代码开始之前声明默认数组 - 它不需要在任何循环内。)

答案 1 :(得分:0)

您可能可以指定默认数组结构,例如

if (!is_array($LineData))
{
  $LineData = 
  array(
    'Server'    => ...,
    'Logdate'   => ...,
    'BackupSet' => ...,
    'StartTime' => ...,
    'Duration'  => 0,
    'DBServer'  => ...,
    'Size'      => 0,
    'Status'    => 'incomplete',
  );
}
foreach ($matches as $information)
{
  $LineData[$information[2]] = $information[3];
}
$data[] = $LineData;