1

以下の内容のサンプルを含むファイルがあり、ファイルには以下のような複数の行があります。

Jan 6 10:32:45 id=example sn=0123456789 time="2013-01-06 10:32:46 UTC" fw=1.2.3.4 pri=1 c=0 m=1000 msg="行出力の例" sid =100 cat=TEST-PHP pid=200 src=1.2.3.5:1234:Z1-C444 dst=1.2.3.6:4321:Z1-C444:

私が達成しようとしているのは、これらの行を読み取り、行に基づいて配列に分割し、次に var= 値に基づいてネストされた配列に分割することです。次に例を示します。

Array (
[0] => Array
       (
       [0] => "Jan 6 10:32:45"
       [id] => "example"
       [sn] => "0123456789"
       [time] => "2013-01-06 10:32:46 UTC"
       [fw] => "1.2.3.4"
       [pri] => "1"
       [c] => "0"
       [m] => "1000"
       [msg] => "Example Line Output"
       [sid] => "100"
       [cat] => "TEST-PHP"
       [pid] => "200"
       [src] => "1.2.3.5:1234:Z1-C444"
       [dst] => "1.2.3.6:4321:Z1-C444:"
      )
[1] => Array
       (
        [1] => "Jan 7 1:50:40"
       [id] => "example2"
       [sn] => "0123456799"
       [time] => "2013-01-07 1:50:41 UTC"
       [fw] => "1.2.3.4"
       [pri] => "2"
       [c] => "2"
       [m] => "2000"
       [msg] => "Example Line Output 2"
       [sid] => "200"
       [cat] => "TEST-PHP"
       [pid] => "200"
       [src] => "1.2.3.7:1234:Z1-C444"
       [dst] => "1.2.3.8:4321:Z1-C444:"
      )
)

私ができる唯一のことは、各行を1つの配列に入れることです。上記のようにデータを入力することはできません。どんな助けでも大歓迎です。

編集:これは私が持っているコードで、非常に単純で、ファイルを読み取り、各行を配列に分割します。

<?php
$filename = "/var/www/html/openfile.log";
// Open the file
$fp = @fopen($filename, 'r');
// Add each line to an array
if ($fp) {
    $array = explode("\n", fread($fp, filesize($filename)));
}
echo "<pre>";
print_r($array);
echo "</pre>";
?>
4

3 に答える 3

0

あなたの答えのほとんどはparse_strです。ただし、最初の変数の名前を追加する必要があり、スペースの代わりにアンパサンドが必要です。したがって、これは単純な答えです。

$str = ...whatever your string is...;
$str = "date=".$str; // Add a name for the first date
$str = str_replace(' ','&',$str);
parse_string($str, $array_of_names_and_values);

ここでの問題は、値がスペースで分割されることです。したがって、parse_string を実行する前にスペースを置き換える必要があります。これは、上記の単純な str_replace の代わりに行うことです。

for($oldstr = $str; $oldstr != ($str = preg_replace('/(="[^" ]*) /', '\1NOT_A_SPACE', $str)); $oldstr = $str);
$str = preg_replace('/\s+/', '&', $str);
$str = str_replace('NOT_A_SPACE', ' ', $str);

まず、引用符の間のすべてのスペースを NOT_A_SPACE に置き換えます。次に、スペースをアンパサンドに置き換えます。次に、NOT_A_SPACE をスペースに置き換えます。

于 2013-06-07T13:21:07.937 に答える
0

あなたのスクリプトに似たもの

$var = file('openfile.log');

$output = array();
foreach($var as $v){
$datainthisline = trim($v);
if($datainthisline != '(' && $datainthisline != ')' && $datainthisline != 'Array (' ){
    if(strpos($datainthisline, 'Array')){
        $pararrvar = explode("=>", $datainthisline);
        $pararrvar_key = str_replace(array('[',']'), "", $pararrvar[0]);
    }
    else{
        $valarrvar = explode("=>", $datainthisline);
        $valarrvar_key = str_replace(array('[',']'), "", $valarrvar[0]);
        $output[trim($pararrvar_key)][trim($valarrvar_key)] = trim(trim($valarrvar[1]), '"')
    }
}
}
于 2013-06-07T13:30:21.770 に答える