2013-06-04 3 views
0

Не могли бы вы помочь мне с разделением большой строки на подстроки?Как разделить строку с датой в качестве разделителя?

Сценарий: В одном из полей в MySQL таблицы У меня есть строка, в которой есть журнал активности в следующем формате:

yyyy-mm-dd hh:mm:ss - Name1 Surname1 - Activity1 
yyyy-mm-dd hh:mm:ss - Name2 Surname2 - Activity2 
yyyy-mm-dd hh:mm:ss - Name3 Surname3 - Multiline Activity1 
Multiline Activity2 
Multiline Activity3 
yyyy-mm-dd hh:mm:ss - Name4 Surname4 - Activity4 

Вопрос:

Как я могу разделить выше данные в массив, подобный этому:

id  date     name     activity 
1  yyyy-mm-dd hh:mm:ss  Name1 Surname1   Activity1 
2  yyyy-mm-dd hh:mm:ss  Name2 Surname2   Activity2 
3  yyyy-mm-dd hh:mm:ss  Name3 Surname3   Multiline Activity 1, Multiline Activity2, Multiline Activity 3 
4  yyyy-mm-dd hh:mm:ss  Name4 Surname4   Activity4 

используя запрос PHP или MySQL?

Я знаю, что это может быть сделано каким-то образом, но, к сожалению, знание PHP/MySQL не позволяет мне анализировать текст с разделителем переменных (date), или, может быть, есть другой способ?

+0

Используйте разделитель '-'. –

+0

Почему бы вам просто не разделить на «-»? – Rob

+0

Вы можете сделать это даже с mysql. Проверьте этот отличный ответ: http://stackoverflow.com/questions/6152137/mysql-string-split Однако это расширенное использование, для мастеров-программистов :) – hek2mgl

ответ

1

Вы можете попробовать с preg_split:

$string = <<<STR 
2013-06-04 12:12:12 - Name1 Surname1 - Activity1 
2013-06-04 12:12:12 - Name2 Surname2 - Activity2 
2013-06-04 12:12:12 - Name3 Surname3 - Multiline Activity1 
Multiline Activity2 
Multiline Activity3 
2013-06-04 12:12:12 - Name4 Surname4 - Activity4 
STR; 

$arr = preg_split("/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - (.*) - (.*)[\r\n]?/", $string, null, PREG_SPLIT_DELIM_CAPTURE); 

$arr = array_filter($arr); 

print_r($arr); 

Выход:

Array 
(
    [1] => 2013-06-04 12:12:12 
    [2] => Name1 Surname1 
    [3] => Activity1 
    [5] => 2013-06-04 12:12:12 
    [6] => Name2 Surname2 
    [7] => Activity2 
    [9] => 2013-06-04 12:12:12 
    [10] => Name3 Surname3 
    [11] => Multiline Activity1 
    [12] => Multiline Activity2 
Multiline Activity3 

    [13] => 2013-06-04 12:12:12 
    [14] => Name4 Surname4 
    [15] => Activity4 
) 

Пример для реального использования:

$i = -1; 
$result = array(); 

foreach($arr as $value) { 
    if(preg_match("/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/", $value)) { 
     // 1st element - datetime 
     $i++; 
     $result[$i]['datetime'] = $value; 
    } elseif(!isset($result[$i]['name'])) { 
     // 2nd element - name 
     $result[$i]['name'] = $value; 
    } else { 
     // 3rd element - activities separated by comma 
     if(!isset($result[$i]['activities'])) { 
      $result[$i]['activities'] = $value; 
     } else { 
      $result[$i]['activities'] .= ', ' . $value;   
     } 
    } 
} 

print_r($result); 

Выход:

Array 
(
    [0] => Array 
     (
      [datetime] => 2013-06-04 12:12:12 
      [name] => Name1 Surname1 
      [activities] => Activity1 
     ) 

    [1] => Array 
     (
      [datetime] => 2013-06-04 12:12:12 
      [name] => Name2 Surname2 
      [activities] => Activity2 
     ) 

    [2] => Array 
     (
      [datetime] => 2013-06-04 12:12:12 
      [name] => Name3 Surname3 
      [activities] => Multiline Activity1 
, Multiline Activity2 
Multiline Activity3 

     ) 

    [3] => Array 
     (
      [datetime] => 2013-06-04 12:12:12 
      [name] => Name4 Surname4 
      [activities] => Activity4 
     ) 

) 
+0

спасибо, это именно то, что я искал! приветствия и хороший день сэр;) – user2451110

0

Цикл по результату MySQL и для каждой строки, выполните следующее:

$row = explode(' - ', $row); 
+0

Проблемы с этим решением: имя может быть дефисным, например. Джон Доу. Активность содержит неизвестный набор символов (нам). – BLaZuRE

+0

@BLaZuRE И откуда вы это знаете? – silkfire

+0

Я код для наихудших сценариев, поэтому я указываю на потенциальные проблемы, а не на downvoting. – BLaZuRE

Смежные вопросы