我必须将一长串数据转换为值,以便我可以将它们导入到我的数据库中。不幸的是,数据显示为文本而不是XML,因此我需要一种方法将其转换为理想情况下的key->值数组。
数据如下所示:
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
经过研究,似乎爆炸可能是实现这一目标的可行方法,但我不确定如何在这个场景中实现它,或者是否有更好的方法来实现这一点。特别是因为字符串中间可以有随机连字符和换行符。
提前获得任何帮助!
答案 0 :(得分:3)
由于值可以包含短划线并分布在多行中,我认为从值中分离键的最安全的方法是使用substr()
,因为分隔符号始终位于字符串中的相同字符位置。
<强>固定强>
<?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);
?>