Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 帮助preg_match_all和创建默认值_Php_Preg Match All - Fatal编程技术网

Php 帮助preg_match_all和创建默认值

Php 帮助preg_match_all和创建默认值,php,preg-match-all,Php,Preg Match All,我需要php帮助/专业知识来调整/更改这个preg\u match\u all函数。我要做的是为缺少的有序对创建默认值。它正确地匹配了数据,但我需要一些逻辑来添加一些默认值。(请参见下面的预期数据输出)。这可以在同一个函数中处理吗?谢谢 preg_match_all片段: foreach ($InputFile as $line){ preg_match_all("/([0-9])-([^=]+)=([^;]+);/", $line, $matches, PREG_SET_ORDER);

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

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
阵列输出:(当前)

预期数据输出:(使用默认值)

每个帮助的代码更改:

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

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

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

$output_with_defaults = array_merge($defaults, $output_without_defaults);
这是由于
array\u merge()
中的以下行为导致的:

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

对于您的情况,您希望修改此行:

$data[] = $LineData;

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

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

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

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;

这是在preg_match_all函数之后吗?@cjd143SD-在启动$LineData之前。这只是为了确保所有匹配都以具有某个默认值的数组开始。因此,如果某些信息不可用,它将使用默认值,与@Amber question没有太大区别,这非常有趣。在foreach中的preg_match_all函数之后,我会插入这个吗?谢谢。我为你的特殊情况编辑了一个更详细的解释。嗨,amber,我把我的代码贴在你输入的上面。我还不能让合并工作。有些东西坏了。thxI编辑了您发布的代码。请注意,它实际上是工作的(除了不必要地复制我对array_merge的示例调用),但是您的print语句正在打印未修改的数组版本。我已将其更改为使用
print\r()
调用
$data
,之后将显示修改后的版本。
$data[] = array_merge($defaults, $LineData);
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;