如何在PHP中检查数组度?

2022-08-30 23:38:02

我能想到的最好的是

function is_array_alike($array) {
  return is_array($array) || (is_object($array) && $array instanceof ArrayAccess && $array instanceof Traversable && $array instanceof Serializable && $array instanceof Countable);
}

呸。还有比这更漂亮的东西吗?

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


答案 1

好吧,既然您在帖子中使用了“漂亮”这个词,那么为了可读性,只需对外观更改提出一个快速建议:

function is_array_or_alike($var) {
  return is_array($var) ||
           ($var instanceof ArrayAccess  &&
            $var instanceof Traversable  &&
            $var instanceof Serializable &&
            $var instanceof Countable);
}

更改说明:

  1. 函数名称更改:“” -> “”只是为了清楚地表明正在测试数组性和相似性。is_array_alikeis_array_or_alike

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

  3. 堆叠 &'ed 条件,以提高可读性和符合 Drupal 编码标准:最大 80 个字符行。由于你是Drupal核心维护者之一,我想我假设这个功能可能会进入Drupal,所以你可能在提交之前会这样做。

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

我同意paulmatthews86的建议,即你提供一个用例。如果我们不知道标准,就很难提供建议。例如,从鸭子类型范式的角度来看,测试将是有用的,但不一定是强制性的,甚至不完整。如果您对 它可以做什么以及它在某些上下文中的行为方式更感兴趣,那么您可以使用反射来检查以后需要在其上调用的方法是否存在,或者您可以测试它在传递给数组函数时的行为是否符合预期。例如,它是否与 、 等“一起工作”。如果这些行为对你的用例更重要,那么这些测试可能会取代类型测试,尽管当然会有很多重叠。instanceof$vararray_udiff_assocarray_chunkinstanceof

希望这有帮助。有兴趣看看你最终决定什么,如果你决定发布它。


答案 2

php中有迭代器接口 http://php.net/manual/en/class.iterator.php

function isIter($abc) {
    return (is_array($abc) || $abc instanceof Traversable);
}

推荐