php将带有新行的字符串转换为数组?

问题描述:

I am getting data from an API and the resulting string is

[RESPONSE]
PROPERTY[STATUS][0]=ACTIVE
PROPERTY[REGISTRATIONEXPIRATIONDATE][0]=2012-04-04 19:48:48
DESCRIPTION=Command completed successfully
QUEUETIME=0
CODE=200
RUNTIME=0.352

QUEUETIME=0
RUNTIME=0.8

EOF

I am trying to convert this into an array like

Array(
['PROPERTY[STATUS][0]'] => ACTIVE,
['CODE'] => 200,
...
);

So I am trying to explode it using the resulting file_get_content function with an explode like

$output = explode('=',file_get_contents($url));

But the problem is the returning values are not always returned in the same order, so I need to have it like $array['CODE'] = 200, and $array['RUNTIME'] = 0.352 however there does not seem to be any kind of new line characters? I tried , , <br>, in the explode function to no avail. But there is new lines in both notepad and the browser.

So my question is there some way to determine if a string is on a new line or determine what the character forcing the new line is? If not is there some other way I could read this into an array?

To find out what the breaking character is, you could do this (if $data contatins the string example you've posted):

echo ord($data[strlen('[RESPONSE]')]) . PHP_EOL;
echo ord($data[strlen('[RESPONSE]')+1]);          // if there's a second char

Then take a look in the ASCII table to see what it is.

EDIT: Then you could explode the data using that newly found character:

explode(ord($ascii_value), $data);

Btw, does file() return a correct array?

Explode on " " with double quotes so PHP understands this is a line feed and not a backslashed n ;-) then explode each item on =

Why not just use parse_ini_file() or parse_ini_string()?

It should do everything you need (build an array) in one easy step.

Try

preg_split("/$/m", $str)

or

preg_split("/$
?/m", $str)

for the split

The lazy solution would be:

$response = strtr($response, "", "
");
preg_match_all('#^(.+)=(.+)\s*$#m', $response, $parts);
$parts = array_combine($parts[1], $parts[2]);

Gives you:

Array (
 [PROPERTY[STATUS][0]] => ACTIVE
 [PROPERTY[REGISTRATIONEXPIRATIONDATE][0]] => 2012-04-04 19:48:48
 [DESCRIPTION] => Command completed successfully
 [QUEUETIME] => 0
 [CODE] => 200
 [RUNTIME] => 0.8