Just to clarify; we're talking about an array of bibliographic records, which each consisting of an array of - at this stage - "lines", of which some are Authors, some are Citations, etc. And for each record you want to be able to pin down which lines are which for each record in turn. We're not talking BibTeX, unfortunately....
I don't see how you're going to avoid the necessary parsing to see if a line starts with "AU" or not; you have to get that information somehow. This '25' you mention - is that the number of lines per record or the number of different types of line? (I'd be very surprised to hear it's the latter!)
I'm just playing around here:
$authors = preg_grep('/^AU/', $record);
$record = array_diff($record, $authors);
$title = preg_grep('/^TI/', $record);
$record = array_diff($record, $title);
//...
So that each type of line gets its own array. Whatever is left after identifying whatever is prefixed you're left with distinguishing unprefixed elements from each other.
Hm. Yeah. Functional programming.
But you mention that to find keywords and citations you have to find the next record. What mechanism do you have to determine where one record leaves off and the next begins? There must be something otherwise how do you know where, say, the keywords begin?