2012-03-13 4 views
4

array_values()はArrayAccessオブジェクトでは機能しません。 もありませんarray_keys()ArrayAccessオブジェクトではarray_valuesが機能しません

なぜですか?

私はありません、あなたがArrayAccessのの有用性を誤解してきた配列操作

+0

例を示してください。 – powtac

+0

array_keys($ arrayaccessobject); ? – thelolcat

+0

array_key_exists()も動作しないというhttp://www.php.net/manual/en/class.arrayaccess.php#104061というコメントがあります。 – powtac

答えて

4

のすべての種類を行うことができるはず$object['key']にアクセスすることができます。これは配列のラッパーの一種ではありません。はい、それを実装するための標準的な例では、その機能がクラスによってラップされた専用の$array変数を使用しますが、それは特に有用なものではありません。多くの場合、配列を使用することもできます。

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

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

ArrayAccessでは、配列の構文を使用してオブジェクトを設定、更新、取得、または削除するための配列構文を使用できます。

別のインターフェイスCountableは、count()の使用を許可します。両方のインターフェイスを同じクラスで使用できます。理想的には、おそらくarray_valuesまたはarray_keysを行うことができるインターフェイスを含むより多くのインターフェイスが存在しますが、現在は存在しません。

2

ArrayAccessは非常に限られています。ネイティブのarray_機能を使用することはできません(既存のインターフェイスはありません)。

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

したがって、オブジェクトを作成し、ArrayObjectを拡張します。これはIteratorAggregate,Traversable,ArrayAccess,SerializableおよびCountableを実装しています。あなたが次に

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

することができます:あなたは、キーが必要な場合は、単にarray_keysメソッドを追加

foreach ($object->array_keys() as $key) { 
    echo $object[$key]; 
} 
0

ArrayObject/ArrayAccessは、オブジェクトが配列として動作することができますが、彼らはまだですオブジェクト。

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

をか(array) $ArrObj、例えばによって配列にそれをキャストすることによって、あなたのArrayObjectを変換しますので、代わりに(アレイ上でのみ動作)array_keys()のあなたには、例えば、get_object_vars()を使用する必要があります:

var_dump(array_keys((array)$ArrObj)); 
関連する問題