Преобразование строки данных в массив с помощью PHP - PullRequest
1 голос
/ 07 ноября 2011

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

Данные выглядят так:

AU  - Author 1
AU  - Author 2
AU  - Author 3
LA  - ENG
PT  - ARTICLE
DEP - 235234
TA  - TA
JN  - Journal name
JID - 3456346
EDAT- 2011-11-03 06:00
MHDA- 2011-11-03 06:00
CRDT- 2011-11-03 06:00
TI  - multi-line text text text text text
      text text tex tex text
      text text tex tex text

После исследования кажется, что взорвать может быть жизнеспособным средством для достижения этой цели, но я не уверен, как реализовать это в этом сценарии, или есть ли лучший способ сделать это.Тем более, что в середине строки могут быть случайные дефисы и разрывы строк.

Любая помощь высоко ценится заранее!

1 Ответ

3 голосов
/ 07 ноября 2011

Поскольку значения могут содержать тире и распределяться по нескольким строкам, я думаю, что самый безопасный способ отделения ключей от значений - это использование substr(), поскольку разделяющие тире всегда находятся в одной и той же позиции символа в строке.

FIXED

<?php

  // first, split into lines
  $lines = explode("\n",str_replace(array("\r\n","\r"),"\n",$data));

  // this will hold the parsed data
  $result = array();

  // This will track the current key for multi-line values
  $thisKey = '';

  // Loop the split data
  foreach ($lines as $line) {
    if (substr($line,4,1) == '-') {
      // There is a separator, start a new key
      $thisKey = trim(substr($line,0,4));
      if ($result[$thisKey]) {
        // This is a duplicate value
        if (is_array($result[$thisKey])) {
          // already an array
          $result[$thisKey][] = trim(substr($line,5));
        } else {
          // convert to array
          $result[$thisKey] = array($result[$thisKey],trim(substr($line,5)));
        }
      } else {
        // Not a duplicate value
        $result[$thisKey] = trim(substr($line,5));
      }
    } else {
      // There is no separator, append data to the last key
      if (is_array($result[$thisKey])) {
        $result[$thisKey][count($result[$thisKey]) - 1] .= PHP_EOL.trim(substr($line,5));
      } else {
        $result[$thisKey] .= PHP_EOL.trim(substr($line,5));
      }
    }
  }

  print_r($result);

?>

Посмотри, как работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...