array_values()
ArrayAccessオブジェクトでは機能しません。どちらもしませんarray_keys()
なぜ?
アクセスできれば、$object['key']
あらゆる種類の配列操作を実行できるはずです。
array_values()
ArrayAccessオブジェクトでは機能しません。どちらもしませんarray_keys()
なぜ?
アクセスできれば、$object['key']
あらゆる種類の配列操作を実行できるはずです。
いいえ、ArrayAccessのユーティリティを誤解しています。これは、配列の単なるラッパーではありません。はい、それを実装するための標準的な例では$array
、機能がクラスによってラップされているプライベート変数を使用していますが、それは特に有用なものではありません。多くの場合、配列だけを使用することもできます。
ArrayAccessの良い例の1つは、スクリプトが使用可能な変数を認識していない場合です。
かなりばかげた例として、リモートサーバーで動作するオブジェクトを想像してみてください。そのサーバー上のリソースは、ネットワーク全体でAPIを使用して読み取り、更新、および削除できます。プログラマーは、その機能を配列のような構文でラップすることを決定したので、そのサーバー上のリソースをに$foo['bar'] = 'foobar'
設定して取得します。スクリプトには、考えられるすべての値を試さずに、存在するキーまたは値を見つける方法がありません。bar
foobar
echo $foo['bar']
したがって、ArrayAccessでは、配列のような構文でオブジェクトを設定、更新、取得、または削除するために配列構文を使用できます。それ以上でもそれ以下でもありません。
別のインターフェース、、はCountable
、の使用を許可しますcount()
。同じクラスで両方のインターフェースを使用できます。理想的には、そのようなインターフェースがもっとあるでしょう。おそらく、できるものarray_values
やできるものも含まれますarray_keys
が、現在は存在していません。
ArrayAccess
非常に限られています。ネイティブarray_
関数の使用は許可されていません(既存のインターフェースでは使用できません)。
オブジェクトに対してより配列のような操作を行う必要がある場合は、基本的にコレクションを作成しています。コレクションは、そのメソッドによって操作する必要があります。
したがって、オブジェクトを作成し、ArrayObjectを拡張します。これは、、、、およびを実装しIteratorAggregate
ます。Traversable
ArrayAccess
Serializable
Countable
キーが必要な場合は、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];
}
ArrayObject
/を使用すると、ArrayAccess
オブジェクトを配列として機能させることができますが、それでもオブジェクトです。したがって、array_keys()
(配列でのみ機能する)の代わりに、次のように使用する必要がありますget_object_vars()
。
var_dump(array_keys(get_object_vars($ArrObj)));
または、次のようにArrayObjectを配列にキャストして変換します(array) $ArrObj
。
var_dump(array_keys((array)$ArrObj));