6

array_values()ArrayAccessオブジェクトでは機能しません。どちらもしませんarray_keys()

なぜ?

アクセスできれば、$object['key']あらゆる種類の配列操作を実行できるはずです。

4

3 に答える 3

5

いいえ、ArrayAccessのユーティリティを誤解しています。これは、配列の単なるラッパーではありません。はい、それを実装するための標準的な例では$array、機能がクラスによってラップされているプラ​​イベート変数を使用していますが、それは特に有用なものではありません。多くの場合、配列だけを使用することもできます。

ArrayAccessの良い例の1つは、スクリプトが使用可能な変数を認識していない場合です。

かなりばかげた例として、リモートサーバーで動作するオブジェクトを想像してみてください。そのサーバー上のリソースは、ネットワーク全体でAPIを使用して読み取り、更新、および削除できます。プログラマーは、その機能を配列のような構文でラップすることを決定したので、そのサーバー上のリソースをに$foo['bar'] = 'foobar'設定して取得します。スクリプトには、考えられるすべての値を試さずに、存在するキーまたは値を見つける方法がありません。barfoobarecho $foo['bar']

したがって、ArrayAccessでは、配列のような構文でオブジェクトを設定、更新、取得、または削除するために配列構文を使用できます。それ以上でもそれ以下でもありません。

別のインターフェース、、はCountable、の使用を許可しますcount()。同じクラスで両方のインターフェースを使用できます。理想的には、そのようなインターフェースがもっとあるでしょう。おそらく、できるものarray_valuesやできるものも含まれますarray_keysが、現在は存在していません。

于 2012-03-13T23:17:45.020 に答える
3

ArrayAccess非常に限られています。ネイティブarray_関数の使用は許可されていません(既存のインターフェースでは使用できません)。

オブジェクトに対してより配列のような操作を行う必要がある場合は、基本的にコレクションを作成しています。コレクションは、そのメソッドによって操作する必要があります。

したがって、オブジェクトを作成し、ArrayObjectを拡張します。これは、、、、およびを実装しIteratorAggregateます。TraversableArrayAccessSerializableCountable

キーが必要な場合は、array_keysメソッドを追加するだけです。

public function array_keys($search_value = null, $strict = false)
{
    return call_user_func_array('array_keys', array($this->getArrayCopy(), $search_value, $strict));
}

次に、次のことができます。

foreach ($object->array_keys() as $key) {
    echo $object[$key];
}
于 2012-03-13T23:28:15.297 に答える
0

ArrayObject/を使用すると、ArrayAccessオブジェクトを配列として機能させることができますが、それでもオブジェクトです。したがって、array_keys()(配列でのみ機能する)の代わりに、次のように使用する必要がありますget_object_vars()

var_dump(array_keys(get_object_vars($ArrObj)));

または、次のようにArrayObjectを配列にキャストして変換します(array) $ArrObj

var_dump(array_keys((array)$ArrObj));
于 2015-12-10T17:50:23.813 に答える