2011-01-11 8 views
0

私はこのpreg_match_all機能を調整/変更するためのPHPヘルプ/専門知識が必要です。私がしたいのは、順序付けされていないペアのデフォルト値を作成することです。データを正しく照合していますが、デフォルト値を追加するロジックが必要です。 (下記のデータ出力を参照してください)。同じ機能の中でこれを扱うことはできますか?ありがとう!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)の順に属性の最大があります:

preg_match_allはスニペット

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

答えて

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

こと(そして、のいずれかの開始前に、デフォルトの配列を宣言すること現在のコード - これはループ内にある必要はありません)

+0

かなり面白いです。 foreach内でpreg_match_all関数の後にこれをプラグインしますか?ありがとう。 – cjd143SD

+0

私は、あなたの特定のケースについての詳細な説明を編集しました。 – Amber

+0

こんにちは、私は入力したコードを上に掲載しました。私はまだ仕事に合併を得ることができません。何かが故障しています。 thx – cjd143SD

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; 
+0

これはpreg_match_all関数の後になるでしょうか? – cjd143SD

+0

@ cjd143SD - $ LineDataを開始する前に。これは、すべての一致が何らかのデフォルト値を持つ配列で始まることを保証することです。したがって、情報の一部が利用できない場合、デフォルト値を使用しますが、@Amberの質問との相違はあまりありません – ajreal

関連する問題