public function loopable($subject)
    {
        // Only difference vs container() is that non-Traversable ArrayAccess
        // doesn't pass here.
        return is_array($subject) ? 'array' : (
            $subject && is_object($subject) ? (
                $subject instanceof \Traversable ? (
                    $subject instanceof \ArrayAccess ? 'arrayAccess' : 'traversable'
                ) : (
                    $subject instanceof \ArrayAccess ? false : 'object'
                )
            ) : false
        );
    }
public function loopable($subject)
    {
        // Only difference vs container() is that non-Traversable ArrayAccess
        // doesn't pass here.
        return is_array($subject) ? 'array' : (
            $subject && is_object($subject) ? (
                $subject instanceof \Traversable ? (
                    $subject instanceof \ArrayAccess ? 'arrayAccess' : 'traversable'
                ) : (
                    $subject instanceof \ArrayAccess ? false : 'object'
                )
            ) : false
        );
    }
public function loopable ( $ subject ) { // Only difference vs container() is that non-Traversable ArrayAccess // doesn't pass here. return is_array ( $ subject ) ? 'array' : ( $ subject && is_object ( $ subject ) ? ( $ subject instanceof \ Traversable ? ( $ subject instanceof \ ArrayAccess ? 'arrayAccess' : 'traversable' ) : ( $ subject instanceof \ ArrayAccess ? false : 'object' ) ) : false ) ; }
Array or Traversable object, or non-Traversable non-ArrayAccess object.

'arrayAccess' is a Traversable ArrayAccess object.

Counter to iterable loopable allows non-Traversable object,
except if (also) ArrayAccess.

Non-Traversable ArrayAccess is (hopefully) the only relevant container
class/interface that isn't iterable.

@param $subject
object|array to pass validation.

@return string|bool
String (array|arrayAccess|traversable|object) on pass,
boolean false on validation failure.
Array or Traversable object or non - Traversable non - ArrayAccess object .