PHP 的 ArrayObject 是不是有 in_array 等价物?

Posted

技术标签:

【中文标题】PHP 的 ArrayObject 是不是有 in_array 等价物?【英文标题】:Does PHP's ArrayObject have an in_array equivalent?PHP 的 ArrayObject 是否有 in_array 等价物? 【发布时间】:2010-11-15 14:07:33 【问题描述】:

php 有一个in_array 函数,用于检查本机数组/集合中是否存在特定值。我正在寻找 ArrayObject 的等效函数/方法,但 methods 似乎都没有重复此功能。

我知道我可以将 ArrayObject 转换为(数组)并在 in_array 中使用它。我也知道我可以手动迭代 ArrayObject 并查找值。两者似乎都不是“正确”的做法。

如果你有证据支持,“否”是一个非常合适的答案。

【问题讨论】:

您提供的文档似乎很清楚地表明没有这种方法。学究式地说,我们真的不可能严格证明不存在这样的功能。链接的文档是您将获得的所有证据。 从事 PHP 核心工作的人可能有更多信息。遇到问题并提交错误报告的人可能有更多信息。 PHPs OO 文档通常不能涵盖它所能涵盖的所有内容。我可能错过了一些明显的东西。仅仅因为不能回答问题并不意味着没有答案。 【参考方案1】:

没有。即使忽略文档,您也可以自己查看

echo '<pre>';
print_r( get_class_methods( new ArrayObject() ) );
echo '</pre>';

所以你几乎没有选择。正如您所说,一种选择是投射它

$a = new ArrayObject( array( 1, 2, 3 ) );
if ( in_array( 1, (array)$a ) )

  // stuff

这是 IMO 的最佳选择。您可以使用 getArrayCopy() 方法,但这可能比强制转换操作更昂贵,更不用说这种选择的语义有问题了。

如果封装是您的目标,您可以创建自己的 ArrayObject 子类

class Whatever extends ArrayObject 

  public function has( $value )
  
    return in_array( $value, (array)$this );
  


$a = new Whatever( array( 1, 2, 3 ) );
if ( $a->has( 1 ) )

  // stuff

我根本不推荐迭代,这是 O(n) 并且考虑到替代方案不值得。

【讨论】:

“我根本不推荐迭代,那是 O(n)”in_array 本身就是 O(n),不是吗?

以上是关于PHP 的 ArrayObject 是不是有 in_array 等价物?的主要内容,如果未能解决你的问题,请参考以下文章

php 标准库之ArrayObject

JavaScript中常见数组方法原数组改不改变

为啥扩展的 ArrayObject 比原始的 ArrayObject 快?

编译 swig 输出时未找到 arrayobject.h

ArrayObject 上的 array_slice(或其他 array_* 函数)

Cython:致命错误:使用 numpy 找不到“numpy/arrayobject.h”文件