Do a var_dump on $item->title, because it isn't an array, it is an object. str_replace can only handle actual arrays and strings. If you're expecting this to be an array, then you might have some problems elsewhere and I would look into that.
If you're just looking for a patch, you might be able to get away with casting it. If everything else is working, I would do this because it really has the fewest side-effects:
// convert it to an array before passing it through str_replace
// (array) $item->title
// then convert it back to its original form by casting the result back
// (object) str_replace
$item->title = (object) str_replace( " - Home", "", (array) $item->title );
If title has to be an array, you can get away without the (object), but I think it would be a better idea to track down where title is being set and have the value correct to begin with.
BTW — if you're planning on using $item->title outside of the loop, you also need to make sure you are using a reference so that the item itself is updated:
foreach($results->result as &$item)
{
$item->title = (object) str_replace( " - Home", "", (array) $item->title );
}
$item->titleis an object.