Вам следует избегать циклов для операций такого типа, они добавляют ненужный уровень сложности вашему коду.
// put the last element of $data to $lastName, and remove the last element from $data
$lastName = array_pop($names);
echo join(',',$names) . ' and ' . $lastName;
Есть также много вариантов одной строки, как это:
// replace the last ",name" with " and name"
echo preg_replace('/(,)[a-z]+$/', ' and ', join(',', $names));
Но они не очень понятны неопытным разработчикам PHP.
edit , Если вы счастливы отказаться от массива, который уже есть в вашем примере, вы можете сделать это.
$str = "mathews,neil,ambrose,glen,ethan";
$names = array_slice(explode(',', $str), 0, 3);
$lastName = array_pop($names);
echo join(',', $names) . ' and ' . $lastName;