Когда вы создаете ваш окончательный массив $newObj
в
$newObj[trim($thisLineArr[0])] = trim($thisLineArr[1]);
Вы используете имя в качестве индекса для массива. Поскольку индексы массива должны быть уникальными, это означает, что фактически последняя запись перезаписывает первую, поэтому ваш фактический вывод ...
{"bob":"oh damn","jimmy":"second try incoming again","sam":"third try"}
Так что это фактически первое сообщение, которое отсутствует.
Edit:
Если вы хотите просто получить все сообщения, вы можете сохранить их, используя
$newObj[] = [ "user"=> trim($thisLineArr[0]), "msg" =>trim($thisLineArr[1])];
Что даст вам вывод как ...
[{"user":"bob","msg":"hello"},{"user":"jimmy","msg":"second try incoming again"},{"user":"sam","msg":"third try"},{"user":"bob","msg":"oh damn"}]