如何检查变量是否“可循环”?

Ban*_*ple 3 php

我有一个方法可以接收一个可以是任意数量类型的参数。

它可以是一个数组。

它可能是以某种方式可迭代的对象,例如集合。

它可能完全是其他东西,例如会抛出的字符串或整数

Warning: Invalid argument supplied for foreach()
Run Code Online (Sandbox Code Playgroud)

如何可靠地检查变量是否“可循环”以避免警告?

我试过is_array()如下,但这只适用于数组:

if(is_array($mystery_type)){
    foreach($mystery_type as $value){
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我很惊讶没有在这里找到答案,这可能意味着它非常简单,而且我遗漏了一些明显的东西。

Aym*_*Dev 5

如果您使用的是PHP 7.1+,您可以使用is_iterable()

if (is_iterable($mystery_type)) {
    // your loop
}
Run Code Online (Sandbox Code Playgroud)

或者它的polyfill(在文档注释中找到):

if (!function_exists('is_iterable')) {
    function is_iterable($obj) {
        return is_array($obj) || (is_object($obj) && ($obj instanceof \Traversable));
    }
}
Run Code Online (Sandbox Code Playgroud)

阅读更多iterable伪类型(PHP 7.1+)