Дело в том, что сейчас вы просто записываете в файл содержимое переменной $arr, которая всегда будет одинаковой, независимо от содержимого файла:
fwrite($fp, json_encode($arr) );
Правильный алгоритм таков:
1. Получили содержимое файла;
2. С помощью функции json_decode сделали из содержимого ассоциативный массив;
3. Дописали новые данные в конец этого массива;
4. С помощью функции json_encode из массива снова получили JSON-строку;
5. Записали результат в файл.
В целом структура вашего кода очень похожа на то, что я описал. Вероятно, ошибка вот где:
if(isset($file)){
$arr = array();
}
$arr[count($arr)+1]["name"] = $name;
$arr[count($arr)]["email"] = $email;
echo json_encode($arr);
Вы создали пустой массив, а надо было проинициализировать его данными из файла. Также конструкция echo здесь ни к чему, если конечно только вы не используете ее в тестовых целях.
Кстати, еще один лайфхак - вставку значения в конец массива можно сделать чуть проще:
$arr[] = [
'name' => $name,
'email' => $email
];
Оператор [] позволяет положить значение в конец массива. В данном случае мы кладем ассоциативный массив.