Efficient method to look for an instance of an object in a collection
I think good coding practices should prioritize efficiency before code brevity.  It is important to not ask for unnecessary work to be done (this is part of the artistry of being a clever coder).  Implementing an early exit, in my opinion is a non-negotiable factor in selecting the "best" code design.

Using a function like array_walk_recursive() is handy for its leafnode traversal, but I agree that the syntax of making an early exit is a little unsightly.  For this reason, I recommend a language construct as part of the recursive design.  The conditional logic is the only part that can be condensed, so I've tried to boil it down as much as possible.

Code: (Demo)

function anyFish(array $collection)
{
    foreach ($collection as $item)
    {
        if((is_array($item) &amp;&amp; anyFish($item)) || $item instanceof Fish)
        {
            return true;
        }
    }
    return false;
}


I don't think it is horrible to look at, but everybody loves their own babies.  I'm not sure that I can make it any more readable.