我能想到的最好的办法就是
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的instanceof手册中增加了一个关于这方面的章节。
发布于 2012-09-10 15:23:17
在php http://php.net/manual/en/class.iterator.php中有迭代器接口。
使用
function isIter($abc) {
return (is_array($abc) || $abc instanceof Traversable);
}
发布于 2012-10-05 01:25:29
尽管ArrayObject
实现了Serializable
,但认为对象必须实现它为类似数组的假设是错误的。
情况正好相反。您可以使用Serializable
来有效地防止对象的序列化。因此,我会考虑将其从接口检查中删除。
另外,如果您使用不带对象的instanceof
,您将看到一个(致命)错误。我建议你将一个“类似数组”的对象的检查委托给一个叶函数,并让你的函数使用它,这个函数对输入类型不是很严格:
function is_array_or_object_arraylike($var) {
return is_array($var)
|| (is_object($var) && is_object_arraylike($var))
;
}
function is_object_arraylike($obj) {
return $obj instanceof ArrayAccess
&& $obj instanceof Traversable
&& $obj instanceof Countable
;
}
还要记住,即使对象是类似数组的,它也不能与大多数数组函数一起工作。它在foreach
中也不能很好地工作,所以您应该更好地概述一下您在这里寻找的是哪些数组特性。
发布于 2018-04-18 21:48:22
PHP7.3有一个新的规范,它在https://wiki.php.net/rfc/is-countable中实现了一个is_countable
函数
基于规范&对于以前的PHP版本,您可以使用以下代码
if (is_array($foo) || $foo instanceof Countable) {
return count($foo);
}
或者,您也可以实现一种polyfill,如下所示
if (!function_exists('is_countable')) {
function is_countable($c) {
return is_array($c) || $c instanceof Countable;
}
}
https://stackoverflow.com/questions/12346479
复制相似问题