Лучшее, что я мог придумать, -
function is_array_alike($array) {
return is_array($array) || (is_object($array) && $array instanceof ArrayAccess && $array instanceof Traversable && $array instanceof Serializable && $array instanceof Countable);
}
Тьфу. Есть ли что-то более симпатичное?
Изменить: тест для is_object
кажется ненужным. Я добавил раздел к руководству PHP экземпляра PHP.