2011-09-27 2 views
1

Я хочу взорвать этот текст три одномерных массива:PHP взорваться текстом многомерного массива

Q 11 21 21 (40 44 23 ! 24 ! ! Q ! 32 22 48 18 23 49 ! ! ! ! 24 23 Q ! 19 23 06 49 29 15 22 ! ! ! Q ! 20 (23 23 (40 ! ! ! ! Q ! 21 06 ! 22 22 22 02 ! ! ! 


Q ! (40 05 33 ! 05 ! ! ! ! Q ! 49 49 05 20 20 49 ! ! ! Q ! ! 05 34 (40 ((1 Q ! ! 46 46 46 46 46 46 ! ! ! Q (46 07 20 12 05 33 ! ! ! ! 

Это расписание в текстовой форме. Ниже приведены условия, которые определяют каждое значение в массиве:

  1. новый ряд = следующий раз стол;
  2. Q = новый день;
  3. площадь = следующий час
  4. ! = Свободный час,
  5. (= duplicit час

И я хочу это так: массив [расписание] [день] [час]

Как я могу это сделать Есть ли выбор? сделайте это с помощью PHP взорваться функции?

+2

Удовлетворить мое любопытство: в том, что формат часть стандарта? –

+2

вам нужно будет объяснить лучше, чтобы получить ответы .. – amosrivera

+0

Что мешает вам просто кодировать парсер для этого? Я имею в виду, что вы уже сформулировали формат, что мешает вам продолжить? – hakre

ответ

2

Не понимая, как работают ваши струны; Этот код должен выполнять эту работу.

$timetables = explode("\n", $source); 

foreach($timetables as $tablekey => $days) 
{ 
    $timetables[$tablekey] = explode('Q', $days); 

    foreach($timetables[$tablekey] as $daykey => $hours) 
     $timetables[$tablekey][$daykey] = explode(' ', $hours) 
} 

print_r($timetables, true); 
3

Какой хороший формат, я думаю, что я до сих пор не понимаю, но я постараюсь ответить на все равно ...

  1. использовать explode с «\ п», и вы получите массив расписаний
  2. для каждого элемента этого массива, заменить его explode из себя с «Q», и вы будете иметь 2-мерный массив
  3. для каждого элемента каждого элемента этого массива, заменить элемент с explode из себя с «»

Try, чтобы сделать это, и если у вас возникли проблемы, изменить свой вопрос с кодом вы пришли с.

0
$x = //... 
$x = explode("\n", $x); 
foreach($x as $k => $v) { 
    $x[$k] = explode("Q", $x[$k]); 
    foreach($x[$k] as $kk => $vv) { 
    $x[$k][$kk] = explode(" ", $x[$k][$kk]); 
    } 
} 

С array_map Думаю, вы добьетесь более приятного кода.

+1

Семантический код дает вам лучшее обновление tbh. – sg3s

0

Вот рекурсивная функция, которая принимает массив разделителей:

function multi_explode($delimiters, $val) { 
    $delimiter = array_shift($delimiters); 
    if (!empty($delimiter)) { 
     $val = explode($delimiter, $val); 
     foreach($val as $key => $valval) { 
      $val[$key] = multi_explode($delimiters, $valval); 
     } 
    } 
    return $val; 
}