如何在PHP中检查数组?

chx*_*chx 16 php arrayaccess

我能想到的最好的是

function is_array_alike($array) {
  return is_array($array) || (is_object($array) && $array instanceof ArrayAccess && $array instanceof Traversable && $array instanceof Serializable && $array instanceof Countable);
}
Run Code Online (Sandbox Code Playgroud)

啊.还有更漂亮的东西吗?

编辑:测试is_object似乎没必要.我已经在PHP手册的实例中添加了一个关于它的部分.

Dav*_*vid 11

好吧,因为你在帖子中使用了"漂亮"这个词,所以只是快速建议化妆品的变化以便于阅读:

function is_array_or_alike($var) {
  return is_array($var) ||
           ($var instanceof ArrayAccess  &&
            $var instanceof Traversable  &&
            $var instanceof Serializable &&
            $var instanceof Countable);
}
Run Code Online (Sandbox Code Playgroud)

变更说明:

  1. 功能名称更改:" is_array_alike" - >" is_array_or_alike"只是为了清楚地表明正在测试阵列和相似性.

  2. Param/arg名称更改:$array- > $var因为" $array"已经预先假定参数是数组类型.

  3. 堆叠&&'ed条件,以便于阅读和符合Drupal编码标准:80-char line max.既然你是Drupal核心维护者之一,我想我假设这个函数可能会进入Drupal,所以你可能会在提交之前做到这一点.

  4. 你是对的,这is_object()是不必要的.在Java中,它是必要的,因为instanceof如果第一个操作数不是一个对象会抛出编译时错误,但我刚刚在PHP中检查并且没有错误,只是bool(false)的结果.

我是第二个paulmatthews86的建议,你提供一个用例.如果我们不了解标准,很难提供建议.例如,从鸭子类型范例的角度借用一点,instanceof测试将是有用的,但不一定是强制性的甚至是完整的.如果您对$var某些内容以及它在某些上下文中的行为方式更感兴趣,那么您可以使用反射来检查以后需要在其上调用的方法的存在,或者您可以测试它在传递时的行为与预期相同到数组函数.例如,它是否"工作"带array_udiff_assoc,array_chunk等等.如果这些行为是为您的使用情况下,那么这些测试可能取代更重要的instanceof型式检验,当然,会有很多重叠.

希望这可以帮助.如果您决定发布,有兴趣了解您最终决定的内容.