Finite State Automaton implementation
It's quite good, I especially like the $current_state explanatory variable. Actually, I'd create another one to remove some duplication:

$transitions = $transition_table[$current_state];
if (isset($transitions[$character])) {
    $current_state = $transitions[$character];
    $states[] = $current_state;
}


Some other notes:


The code currently ignores invalid transitions. You could break the loop immediately if a transition is invalid:

foreach (str_split($input_string) as $character) {
    $transitions = $transition_table[$current_state];
    if (isset($transitions[$character])) {
        $current_state = $transitions[$character];
        $states[] = $current_state;
    } else {
        break;
    }
}

Inverting the isset would make the code flatten a little bit:

foreach (str_split($input_string) as $character) {
    $transitions = $transition_table[$current_state];
    if (!isset($transitions[$character])) {
        break;
    }
    $current_state = $transitions[$character];
    $states[] = $current_state;
}

$s2 is unused, I guess you could remove it:


$s2 = 'S2';



  Are there something that I've missed?


The linked page mentions classes and I guess it should have been an object oriented solution. Check the Wikipedia article about the Java implementation, it shows a great example.