PHP ищет строку в файле и печатает строки выше / ниже строки соответствия

#php

#php

Вопрос:

Вопрос:

Я пытаюсь выполнить поиск строки в файле и напечатать только первую строку выше и вторую строку ниже строки соответствия для всех вхождений строки. Есть ли способ добиться этого с помощью PHP-скрипта? (будет обновляться веб-страница с выводом) не удалось найти решение, отличное от использования оболочки grep / awk, которую я не могу использовать.

Содержимое файла:

 "timeUpdated":1533998971008
"name":"ABC"
"uptime":5143980267
"desiredStatus":"STARTED"
"lastReportedStatus":"STARTED"
"started":true
"serverArtifacts":[{"id":73
"timeUpdated":1525213888405
"name":"XYZ"
"uptime":6746828144F
"desiredStatus":"STARTED"
"lastReportedStatus":"STARTED"
"started":true 
"serverArtifacts":[{"id":21 
"timeUpdated":1544131291380
 "name":"KLM"
"uptime":6746828643
"desiredStatus":"STARTED"
"lastReportedStatus":"STARTED"
"started":true "serverArtifacts":[{"id":303
search for string: uptime -> print first line above (name:) and second line blow (lastReportedStatus:)
note: I can only use "uptime" as a search string since all other value pairs occur multiple times in a different sequence on other parts of the file.
expected output:
"name":"ABC"
"lastReportedStatus":"STARTED"
"name":"XYZ"
"lastReportedStatus":"STARTED"
"name":"KLM"
"lastReportedStatus":"STARTED"
  

Комментарии:

1. Содержимое этого файла почти похоже на JSON

2. Да, PHP мог бы это сделать. Какой код вы уже пробовали?

Ответ №1:

Если вы считываете строки в файле в массив:

 $lines = file('file.txt', FILE_IGNORE_NEW_LINES);
  

Затем вы можете просто отслеживать ключ при повторении массива и находить строки относительно строки с «временем безотказной работы», используя простое сложение / вычитание по ключу.

 foreach ($lines as $key => $line) {
    if (substr(trim($line),0, 8) == '"uptime"') {
        $result[] = $lines[$key - 1];
        $result[] = $lines[$key   2] ?? '';
    }
}
  

Возможно, вам потребуется добавить FILE_SKIP_EMPTY_LINES опцию в file() , если между каждой строкой вашего файла действительно есть пустые строки. Я не был уверен, что это было именно так в вопросе здесь.

Мне любопытно, откуда берутся данные файла. Это очень близко к JSON, и если бы был какой-либо способ получить его до конца в исходном коде, нам не пришлось бы иметь дело с этим таким халтурным способом здесь. Этот код будет работать для примера, который вы показали, но он не идеален.