Это из-за этой строки:
printf ("Hi %s,</br />", $name);
Вы не должны печатать / эхо ничего, прежде чем отправлять заголовки.
Сначала найдите свои ключи:
const keys = [...new Set(arr.map(x=>x.type))]
И затем фильтруют массив и отображают свойства:
keys.map(x=>({[x]:arr.filter(s=>s.type==x).map(r=>({title:r.title}))}))
Сначала один:
let arr = [
{type:"orange", title:"First"},
{type:"orange", title:"Second"},
{type:"banana", title:"Third"},
{type:"banana", title:"Fourth"}
];
let oranges = arr.reduce((obj, cur) => {
if(cur.type === "orange") {
obj.push(cur)
}
return obj
},[])
let bananas = arr.reduce((obj, cur) => {
if(cur.type === "banana") {
obj.push(cur)
}
return obj
},[])
console.log(oranges)
console.log(bananas)