sczdavos
sczdavos

Reputation: 2063

PHP explode text to multidimensional array

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?

Upvotes: 0

Views: 4773

Answers (4)

Darth Egregious
Darth Egregious

Reputation: 20106

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

Upvotes: 0

sg3s
sg3s

Reputation: 9567

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

Upvotes: 2

Yaakov Shoham
Yaakov Shoham

Reputation: 10548

$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.

Upvotes: 0

greg0ire
greg0ire

Reputation: 23265

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.

Upvotes: 3

Related Questions