如何使用行尾将文本分解为数组,然后使用PHP用冒号再次分解文本?

时间:2019-04-11 19:10:55

标签: php arrays explode eol

我正在尝试读取结构化的日志文件,逐行爆炸,之后按冒号爆炸。

我正在尝试两种不同的方法fgetsfile_get_contents,但在这两种方法中,我都只能达到一个或另一个目标(由行爆炸)通过冒号)。

这里有代码:

<?php

// using fgets
$file = fopen('/var/www/html/PU1PAX.log', 'r');

while (!feof($file)) { // while not end of file
    $content = fgets($file); // get file's content
    $handle = explode(':', $content); // and explode by string

    echo '<pre>';
    print_r($handle);
    echo '</pre>';
}
fclose($file);


// using file_get_contents
$file = '/var/www/html/PU1PAX.log';
$content = file_get_contents($file);
$handle = explode(PHP_EOL, $content);

echo '<pre>';
print_r ($handle);
echo '</pre>';

代码的第一部分在每一行上打印一个数组:     数组     (         [0] =>记录开始         [1] => 3.0     )

Array
(
    [0] => LOCATION
    [1] =>  DX
)

Array
(
    [0] => CALLSIGN
    [1] =>  PU1PAX
)

Array
(
    [0] => CLUB
    [1] =>   
)

Array
(
    [0] => CONTEST
    [1] =>  CQRJVHF
)

第二部分仅打印一个数组,其中所有行都已排序:

Array
(
    [0] => START-OF-LOG: 3.0
    [1] => LOCATION: DX
    [2] => CALLSIGN: PU1PAX
    [3] => CLUB:  
    [4] => CONTEST: CQRJVHF
)

首先,我想找到一种解决方案,将所有这些数组组合在一起,因为内容或多或少地分离且可行。

对于第二个,如果我可以改变数组的方式来重新分解它(这次是冒号),将字符串的第一部分作为数组的键,第二部分作为数组的值如下例所示:

Array
(
    [START-OF-LOG] => 3.0
    [LOCATION] => DX
    [CALLSIGN] => PU1PAX
    [CLUB] =>   
    [CONTEST] => CQRJVHF
)

但是我完全被卡住了...:-(

3 个答案:

答案 0 :(得分:1)

使用file()函数逐行读取文件,然后可以展开每一行并填充关联数组:

$lines = file('/var/www/html/PU1PAX.log', FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);

$data = [];
foreach ($lines as $line) {
    @list($key, $value) = explode(':', $line, 2);
    $data[$key] = trim($value);
}

print_r($data);

三件事:

  • explode()的第三个参数将处理值也包含“:”字符的情况
  • 我在@上使用了令人讨厌的list()错误抑制来隐藏任何提示,如果行中不包含“:”字符。在这种情况下,trim($value)将为您提供一个空字符串作为值
  • 最后一种情况也是我包含FILE_IGNORE_NEW_LINES标志的原因。 trim($value)会将其删除,但是如果没有“:”字符,换行符将位于$key中,因此最好不要将它们放在首位

答案 1 :(得分:0)

也许您可以逐个字符地读fgetc()

$file=fopen("welcome.txt","r") or exit("Unable to open file!");

while ( !feof($file) ) {

   $line = "";
   do {
       $c = fgetc($file);
       $line .= $c;
   } while ( (!feof($file) and $c != PHP_EOL )

  // TODO: process $line (split in columns)

}


fclose($file);

P.s .:我没有测试此代码。只是一个主意。

答案 2 :(得分:0)

//$items = explode(PHP_EOL, $content); in your case
$items = ['START-OF-LOG:3.0','LOCATION:DX','CALLSIGN:PU1PAX','CLUB:','CONTEST:CQRJVHF'];
foreach($items as $item) {
    $line = explode(':', $item); // and explode by string
    $associtativeArray[$line[0]] = $line[1];
    foreach($line as $line_item) {
        $oneDimensionalArray[] = $line_item;
    } 

    $groupedArray[] = $line;

}

print_r($associtativeArray);
print_r($oneDimensionalArray);
print_r($groupedArray);

这是打印结果:     //这是$ associtativeArray     数组     (         [日志开始] => 3.0         [位置] => DX         [CALLSIGN] => PU1PAX         [CLUB] =>         [比赛] => CQRJVHF     )     //这是$ oneDimensionalArray     数组     (         [0] =>记录开始         [1] => 3.0         [2] =>位置         [3] => DX         [4] =>呼号         [5] => PU1PAX         [6] =>俱乐部         [7] =>         [8] =>比赛         [9] => CQRJVHF     )     //这是$ groupedArray     数组     (         [0] =>数组             (                 [0] =>记录开始                 [1] => 3.0             )

    [1] => Array
        (
            [0] => LOCATION
            [1] => DX
        )

    [2] => Array
        (
            [0] => CALLSIGN
            [1] => PU1PAX
        )

    [3] => Array
        (
            [0] => CLUB
            [1] => 
        )

    [4] => Array
        (
            [0] => CONTEST
            [1] => CQRJVHF
        )
)