92

変数でループを使用したいのですが、たとえばforeach、この変数はさまざまなタイプにすることができます。NULL

だから私がそれforeachをテストする前に:

if(is_array($var)){
  foreach($var as ...

Iteratorしかし、インターフェイスを実装するクラスにもなり得ることに気づきました。多分私は盲目ですが、クラスがインターフェースを実装しているかどうかを確認する方法は?is_a関数やinherits演算子のようなものはありますか?私は見つけましたclass_implements、私はそれを使うことができます、しかし多分もっと簡単な何かがありますか?

そして第二に、もっと重要なのは、この関数が存在すると思いますが、変数is_arrayまたは「インターフェースを実装Iteratorする」かどうかをチェックするのに十分でしょうか、それとももっと何かをテストする必要がありますか?

4

7 に答える 7

83

関数内で使用していて、配列またはTraversableオブジェクトをforeach期待している場合は、次のコマンドでその関数のヒントを入力できます。

function myFunction(array $a)
function myFunction(Traversable)

関数内で使用していない場合foreach、または両方を期待している場合は、この構造を使用して、変数を反復処理できるかどうかを確認できます。

if (is_array($a) or ($a instanceof Traversable))
于 2013-03-24T21:11:03.417 に答える
15

foreach配列とオブジェクトを処理できます。これは次の方法で確認できます。

$can_foreach = is_array($var) || is_object($var);
if ($can_foreach) {
    foreach ($var as ...
}

TraversablePHPではすべてのオブジェクト(すべての配列と同様)がトラバース可能であるため、他の人が回答でそれを示唆しているため、特にチェックする必要はありません。

より技術的に:

foreachあらゆる種類のトラバース可能オブジェクト、つまり配列、プレーンオブジェクト(アクセス可能なプロパティがトラバースされる場所)およびTraversableオブジェクト(または内部get_iteratorハンドラーを定義するオブジェクト)で機能します。

ソース

一般的なPHPプログラミングでは、変数が

  • 配列
  • オブジェクト

はありません

  • ヌル
  • リソース
  • スカラー

あなたはそれに使用することができますforeach

于 2015-05-25T10:03:27.657 に答える
5

Traversable簡単な機能でのインスタンスを確認できます。これはすべてのIterator理由で機能しますIterator extends Traversable

function canLoop($mixed) {
    return is_array($mixed) || $mixed instanceof Traversable ? true : false;
}
于 2013-03-24T21:09:13.827 に答える
2
<?php
$var = new ArrayIterator();

var_dump(is_array($var), ($var instanceof ArrayIterator));

返品bool(false)またはbool(true)

于 2013-03-24T21:04:27.770 に答える
1

PHP 7.1.0では、このような目的のために特別に設計された疑似型と関数が導入されました。iterableis_iterable()

これは[…]新しいiterable疑似型を提案します。このタイプはに類似してcallableおり、単一のタイプではなく複数のタイプを受け入れます。

iterablearrayを実装する任意のまたはオブジェクトを受け入れますTraversable。これらのタイプは両方ともを使用して反復可能であり、ジェネレーター内からforeach使用できます。yield

function foo(iterable $iterable) {
    foreach ($iterable as $value) {
        // ...
    }
}

この[…]is_iterable()は、ブール値を返す関数も追加します。値が反復可能であり、他の値の場合は疑似型trueによって受け入れられる場合。iterablefalse

var_dump(is_iterable([1, 2, 3])); // bool(true)
var_dump(is_iterable(new ArrayIterator([1, 2, 3]))); // bool(true)
var_dump(is_iterable((function () { yield 1; })())); // bool(true)
var_dump(is_iterable(1)); // bool(false)
var_dump(is_iterable(new stdClass())); // bool(false)

この関数is_array($var)を使用して、渡された変数が配列であるかどうかを確認することもできます。

<?php
    var_dump( is_array(array()) ); // true
    var_dump( is_array(array(1, 2, 3)) ); // true
    var_dump( is_array($_SERVER) ); // true
?>

詳細については、PHPで変数が配列であるかどうかを確認する方法をご覧ください。

于 2021-01-08T13:17:13.797 に答える
0

関数

<?php

/**
 * Is Array?
 * @param mixed $x
 * @return bool
 */
function isArray($x) : bool {
  return !isAssociative($x);
}

/**
 * Is Associative Array?
 * @param mixed $x
 * @return bool
 */
function isAssociative($x) : bool {
  if (!is_array($array)) {
    return false;
  }
  $i = count($array);
  while ($i > 0) {
    if (!isset($array[--$i])) {
      return true;
    }
  }
  return false;
}

<?php

$arr = [ 'foo', 'bar' ];
$obj = [ 'foo' => 'bar' ];

var_dump(isAssociative($arr));
# bool(false)

var_dump(isAssociative($obj));
# bool(true)

var_dump(isArray($obj));
# bool(false)

var_dump(isArray($arr));
# bool(true)
于 2018-12-18T00:27:22.823 に答える
0

iterablePHP 7.1以降、まさにこの目的のための疑似型があります。タイプヒントiterableは、任意の配列とインターフェイスの任意の実装を受け入れTraversableます。PHP7.1でも関数が導入されましたis_iterable()。古いバージョンについては、新しい組み込み機能なしで同等のタイプエンフォースメントを実現するために、ここで他の回答を参照してください。

フェアプレー:BlackHoleが指摘したように、この質問はIterableオブジェクトと配列型のヒントの複製のように見えますか?そして彼または彼女の答えは私のものよりもさらに詳細になります。

于 2018-12-18T00:45:46.560 に答える