Feedback Request on Title Capitalization Function Converted From JavaScript to PHP
First things first: You definitely don't need to be making multiple regex function calls while looping the elements generated by a splitting regex function.  Time for an almost complete rewrite.  preg_replace_callback() is the tool that I recommend to do all the heavy lifting. 

Normally, I like to do everything in a single regex expression, but the retaining of the multiple spaces is a simple operation that is sensibly set apart.

There WILL be other fringe cases that other reviewers may shout out (e.g. handling multibyte characters or calling preg_quote() on the incoming blacklist words to avoid any regex pattern conflicts with special characters, and let's not forget about troublesome Mr McGee) but I am going to only focus on the quality of data that you have presented.

There will be other ways to write the pattern but I have a high appreciation for the clarity of (*SKIP)(*FAIL) it basically consumes substrings that should be disqualified and then discards them.  The pipe after the skip-fail non-capturing group will match qualifying consecutive letters. The fullstring matches are passed to the custom function where the first letter is converted to uppercase, then returned.  Finally the fully modified string is returned from the preg_replace_callback().

My regex pattern uses negative lookaheads with the start and end of string anchors (^ &amp; $) to implement the rule regarding capitalizing the first and last word.  Word boundaries (\b) are a great way to isolate a whole word (or parts of a hyphenated word).

Code: (Demo)

$tests = [
    ['this is a test', 'This Is a Test', false],
    ['why sunless tanning is A hot trend', 'Why Sunless Tanning Is a Hot Trend', false],
    ['Satin Sheets are a Luxury you Can Afford', 'Satin Sheets Are a Luxury You Can Afford', false],
    ['the Dangers Of Hiking Without Proper Shoes', 'The Dangers of Hiking Without Proper Shoes', false],
    ['an hour or so', 'An Hour or So', false],
    ['Of the meaning Of Of', 'Of the Meaning of Of', false],
    ['Thing With     Extra Spaces', 'Thing With Extra Spaces', false],
    ['Thing with     extra spaces', 'Thing With     Extra Spaces', true],
    ['Observations of isolated pulsars and disk-fed X-ray binaries.', 'Observations of Isolated Pulsars and Disk-Fed X-Ray Binaries.', false]
];

function APATitle($title, $keepMultipleSpaces = false, $blackList = [])
{
    if (!is_string($title)) {
        return false;
    }

    $blackList = $blackList
        ? array_map('strtolower', (array)$blackList)
        : ['a', 'an', 'and', 'at', 'but', 'by', 'for', 'in', 'nor', 'of', 'on', 'or', 'so', 'the', 'to', 'up', 'yet'];

    if (!$keepMultipleSpaces) {
        $title = preg_replace('~\s+~', ' ', $title);
    }

    return preg_replace_callback(
        '~(?!^)\b(?:' . implode('|', $blackList) . ')\b(?!$)(*SKIP)(*FAIL)|\b[a-z]+\b~',
        function ($m) {
            return ucfirst($m[0]);
        },
        strtolower($title)
    );
}

foreach ($tests as [$input, $expectedOutput, $keepMultipleSpaces]) {
    $output = APATitle($input, $keepMultipleSpaces);
    echo ($output === $expectedOutput ? 'SUCCESS' : 'FAILURE') . ":\t\"{$input}\" became \"{$output}\"\n";
}


Output:

SUCCESS:    "this is a test" became "This Is a Test"
SUCCESS:    "why sunless tanning is A hot trend" became "Why Sunless Tanning Is a Hot Trend"
SUCCESS:    "Satin Sheets are a Luxury you Can Afford" became "Satin Sheets Are a Luxury You Can Afford"
SUCCESS:    "the Dangers Of Hiking Without Proper Shoes" became "The Dangers of Hiking Without Proper Shoes"
SUCCESS:    "an hour or so" became "An Hour or So"
SUCCESS:    "Of the meaning Of Of" became "Of the Meaning of Of"
SUCCESS:    "Thing With     Extra Spaces" became "Thing With Extra Spaces"
SUCCESS:    "Thing with     extra spaces" became "Thing With     Extra Spaces"
SUCCESS:    "Observations of isolated pulsars and disk-fed X-ray binaries." became "Observations of Isolated Pulsars and Disk-Fed X-Ray Binaries."