Как разбить текст на массив в конце строки, а затем снова на двоеточие, используя PHP? - PullRequest
1 голос
/ 11 апреля 2019

Я пытаюсь прочитать структурированный файл журнала, разбить его на строку, а затем на двоеточие.

Я пробую в двух разных подходах fgets и file_get_contents, но в обоих я могу достичь только одной или другой цели (взорваться по строке или по двоеточию).

Здесь у нас есть код:

<code><?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 '
'; } fclose ($ файла); // используя file_get_contents $ file = '/var/www/html/PU1PAX.log'; $ content = file_get_contents ($ file); $ handle = explode (PHP_EOL, $ content); echo '
';
print_r ($handle);
echo '
';

Первая часть кода печатает один массив в каждую строку: массив ( [0] => START-OF-LOG [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 ]

1 голос
/ 11 апреля 2019

Используйте функцию 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, поэтому лучше просто не иметь их в начале
0 голосов
/ 11 апреля 2019
//$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 массив ( [START-OF-LOG] => 3,0 [LOCATION] => DX [CALLSIGN] => PU1PAX [CLUB] => [CONTEST] => CQRJVHF ) // Это $ oneDimensionalArray массив ( [0] => START-OF-LOG [1] => 3,0 [2] => МЕСТО [3] => DX [4] => CALLSIGN [5] => PU1PAX [6] => КЛУБ [7] => [8] => КОНКУРС [9] => CQRJVHF ) // Это $ groupedArray массив ( [0] => Массив ( [0] => START-OF-LOG [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
        )
)
0 голосов
/ 11 апреля 2019

Может быть, вы можете прочитать символ за символом 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);

Ps: я не проверял этот код.Просто идея.

...