Краткий ответ: parse_str
;
parse_str($ajax, $array);
$array === array('username'=>'john', 'password'=>'doe');
Однако способ отправки ваших ajax-данных немного странный. Почему вы сериализуетесь в форматированную строку и отправляете эту строку в качестве значения параметра data? Почему бы вам просто не отправить его напрямую? Тогда вы могли бы использовать $this->input->post('username') === 'john'
без дополнительного уровня десериализации.
Например, сделать это:
$.post(url, $(form).serialize());
вместо этого (что вы, похоже, делаете:
$.post(url, {data:$(form).serialize()});