2013-09-03 3 views
1

У меня возникли проблемы с использованием preg_match_all, чтобы разбить строку на пары значений ключа. Пример моей строки:Строка для ассоциативного массива

"% Название: Фильм% Сортируемый% Писатель:% индексируются: ложные%"

Где ожидать результатов, как:

$result['Title'] = 'Movie'; 
$result['Sortable'] = ''; 
$result['Writer'] = ''; 
$result['Indexed'] = 'false'; 

можно разделить строка, использующая preg_match('/%/',$str,-1,PREG_SPLIT_NO_EMPTY);, но возвращает индексированный массив. Мне нужен ассоциативный массив, чтобы порядок не был важен, и я могу использовать этот ключ в операторе switch. Каким будет правильное регулярное выражение для использования в preg_match_all?

+1

взрываются на "%", то цикл, хотя в resaults и взрываются на ":" –

+0

@Dagon Спасибо. Может быть, я слишком много думал об этом с помощью регулярного выражения. Теперь работает. – Twifty

ответ

4

Try с:

$input = "%Title:Movie%Sortable%Writer:%Indexed:false%"; 
$output = array(); 

$data = explode('%', $input); 
foreach ($data as $item) { 
    list($key, $value) = explode(':', $item); 
    $output[$key] = $value; 
} 
+0

Единственное изменение, которое я сделал, это заменить 'explode' на' preg_split', используя флаг 'NO_EMPTY'. – Twifty

+0

@Waldermort Использование решения без регулярных выражений происходит намного быстрее. – hsz

0
<?php 
$arr = array(); 
$string = "%Title:Movie%Sortable%Writer:%Indexed:false%"; 
$d = explode('%', $string); 

foreach($d as $item){ 
    list($key,$value) = explode(':', $item); 
    $arr[$key] = $value; 

} 

print_r($arr); 
?>