Есть ли у PHP ArrayObject эквивалент in_array? - PullRequest
5 голосов
/ 30 июля 2009

PHP имеет функцию in_array для проверки, существует ли конкретное значение в собственном массиве / коллекции. Я ищу эквивалентную функцию / метод для ArrayObject, но ни один из методов не дублирует эту функцию.

Я знаю, что мог бы привести ArrayObject как (массив) и использовать его в in_array. Я также знаю, что мог бы вручную перебирать ArrayObject и искать значение. Ни один из этих способов не кажется «правильным».

«Нет» - совершенно подходящий ответ, если вы можете подтвердить его доказательствами.

1 Ответ

7 голосов
/ 31 июля 2009

Нет. Даже игнорируя документацию, вы можете увидеть это сами

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

Таким образом, у вас остается несколько вариантов. Один вариант, как вы говорите, это разыграть его

$a = new ArrayObject( array( 1, 2, 3 ) );
if ( in_array( 1, (array)$a ) )
{
  // stuff
}

Какой, ИМО, лучший вариант. Вы могли бы использовать метод 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), и просто не стоит этого, учитывая альтернативы.

...