首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在PHP中检查数组?

如何在PHP中检查数组?
EN

Stack Overflow用户
提问于 2012-09-10 14:39:16
回答 3查看 4.7K关注 0票数 16

我能想到的最好的办法就是

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手册中增加了一个关于这方面的章节。

EN

回答 3

Stack Overflow用户

发布于 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);
}
票数 1
EN

Stack Overflow用户

发布于 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中也不能很好地工作,所以您应该更好地概述一下您在这里寻找的是哪些数组特性。

票数 1
EN

Stack Overflow用户

发布于 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;
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12346479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档