Filling in the card expiry date from transaction data
Your first version of build_expiry_date_string() will be able to build an shorter notation date from any date array. I would therefore rename it to build_short_date_string(). 

The second version actually is named correctly, but can only convert an expiry date to the shorter notation. 

Which is the better version?

Well, clearly, if you need to create a short date string from more than one date array then the first one wins. The second one is more specialized. It will only work for the card_exp date.

In general I don't see the point of overspecializing functions. The more general purpose version does a good job, so I would prefer that one, even if it is, for now, only used for one date array.

Functions should be used to encapsulate functionality that can be reused and therefore make your code easier to maintain. (reference)

It is the reusability that wins for me here, over any other considerations.

Note that we're talking about simple functions here, not methods that are part of classes. OOP is a whole other can of worms.

Some other remarks about your code (this is code review afterall):


You extract() data at the beginning of populate_transaction_info(). This seems like a nice trick, but it makes your code harder to read and debug. For instance, I have to assume that $person is one of these extracted variables, but for me it appears out of thin air. You could help your code reader by using a prefix whenever your extract something: extract(...., EXTR_PREFIX_ALL, 'model'); and then use $model_person, but preferably just explicitly define the person variable in the function.
Your comment: "set to empty array to ensure run-able code" and the subsequent array_merge() make no sense to me. Why not just define the array?