2010-12-02 5 views

ответ

16

Используйте explode(), вы можете использовать regexp для этого, но это достаточно просто без накладных расходов.

$data = array(); 
foreach (explode("\n", $dataString) as $cLine) { 
    list ($cKey, $cValue) = explode(':', $cLine, 2); 
    $data[$cKey] = $cValue; 
} 

Как уже упоминалось в комментариях, если данные поступают из среды Windows/DOS вполне может иметь CRLF новой строки, добавив следующую строку перед foreach() бы решить это.

$dataString = str_replace("\r", "", $dataString); // remove possible \r characters 

Альтернативой с регулярным выражением может быть весьма приятным с помощью preg_match_all() и array_combine():

$matches = array(); 
preg_match_all('/^(.+?):(.+)$/m', $dataString, $matches); 
$data = array_combine($matches[1], $matches[2]); 
+0

Не забудьте, по крайней мере, исключить возможный `` \ r "` из `$ cValue`. – Jon 2010-12-02 14:32:25

1

взорваться первой на линии разрыва. Prolly \ n

Затем взорвите каждый из результирующих элементов массива на: и установите новый массив на этот ключ/значение.

2

Попробуйте

$value = '1|a,2|b,3|c,4|d'; 
$temp = explode (',',$value); 
foreach ($temp as $pair) 
{ 
    list ($k,$v) = explode ('|',$pair); 
    $pairs[$k] = $v; 
} 

print_r($pairs);