Mi sono accorto che facendo copia incolla il preg_replace va a conto suo. Ora provo a scrivertelo senza fare copia incolla.

$frase_array[$c] = preg_replace("/\s+(\S+)?$/","...", substr ($frase_array[$c], 0, 20));

Ora dovrebbe andare.