помочь с preg_match_all и создания значений по умолчанию - PullRequest
0 голосов
/ 11 января 2011

Мне нужна помощь / опыт php, чтобы настроить / изменить эту функцию preg_match_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

Выход массива: (текущий)

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 ]

1 голос
/ 11 января 2011

Можно создать массив значений по умолчанию, а затем использовать 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);

(И объявить массив значений по умолчанию перед началомлюбого текущего кода - он не должен быть внутри каких-либо циклов.)

0 голосов
/ 11 января 2011

Вы, вероятно, можете назначить структуру массива по умолчанию, например

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;
...