0

I want to explode this text to three dimensional array:

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 ! ! ! !

This is timetable is in text form. The following are the conditions that determine each value in the array:

  1. new row = next time table;
  2. Q = new day;
  3. space = next hour
  4. ! = free hour,
  5. ( = duplicit hour

And I want it like this: array[timetable][day][hour]

How can I do that? Is there choice do it by PHP explode function?

3
  • 2
    Satisfy my own curiosity: is that format part of a standard? Commented Sep 27, 2011 at 20:38
  • 2
    you will have to explain better to get any answers.. Commented Sep 27, 2011 at 20:39
  • What prevents you from just coding the parser for that? I mean you already formulated the format, what prevents you to continue? Commented Sep 27, 2011 at 20:48

4 Answers 4

3

What a nice format! I think I still don't get it, but I'll try answering anyway...

  1. use explode with "\n" and you'll get an array of timetables
  2. for each element of this array, replace it with an explode of itself with 'Q' and you'll have a 2-dimensional array
  3. for each element of each element of this array, replace the element with an explode of itself with ' '

Try to do this and if you're having trouble, edit your question with the code you'd come up with.

Sign up to request clarification or add additional context in comments.

Comments

2

Without really understanding how your strings work; This code should do the job.

$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);

Comments

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]);
  }
}

With array_map I think you wiil get somewhat nicer code.

Comments

0

Here is a recursive function that takes an array of delimiters:

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;
}

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.