質問

stdClass オブジェクトを一般的なインデックス付き配列のように機能させることは可能ですか?

つまり$ array = array([0] => 120 [1] => 382 [2] => 552 [3] => 595 [4] => 616)

次のように構築されます

$a = array();
$array[] = 120;
$array[] = 382;

しかし、オブジェクトでそれを行うと、それ自体が上書きされるだけです。

$obj = new stdClass;
$obj->a = 120;
$obj->a = 382;

「a」は毎回変更できることはわかっていますが、

これが愚かな質問であれば申し訳ありませんが、何らかの理由で私を困惑させています。

助けていただければ幸いです:)

ダン

役に立ちましたか?

解決

要するに、いいえ、常にプロパティに名前を付ける必要があるためです。ArrayAccess を使用して単純なクラスを作成するという手間も意味がありません。パフォーマンスと透明性を極端に犠牲にする以外に、表示するものが何もない配列を本質的に再作成することになるからです。

配列を使用するだけでは問題を無限に解決できない何らかの理由があるのでしょうか、それともこれは単なる知りたい質問なのでしょうか?

編集:チェックアウト この質問 詳細については。

他のヒント

いいえ、あなたがすることはできません。そのようなブラケット([])を使用すると、PHPの「ArrayAccessの」と呼ばれ、stdClassオブジェクトで実装されていない。

あなたはのようですね。

のようなものをお勧めします
$foo = new stdClass();
$foo->items = array();
$foo->items[] = 'abc';
$foo->items[] = '123';
$foo->items[] = 'you and me';

また、何が起こるかを見るためにはstdClassとして配列をキャストしようとすることができます。

$foo = array();
$foo[] = 'abc';
$foo[] = '123';
$foo[] = 'you and me';
$foo = (object) $foo;
var_dump($foo);

私は本当にあなたがする何を意味するかを見ることができない、の短い

<?php
$obj->a = array();
$obj->a[] = 120;
$obj->a[] = 382;
// ...
?>

あなたは、単にオブジェクトにフィールドを「プッシュ」することはできません。あなたはとにかく値を取得するために、フィールドの名前を知っている必要があり、それはかなりナンセンスだ。

の目的は、配列ではありません。あなたは数値添字の要素が必要な場合は、配列を使用します。

という名前の要素がオブジェクトまたは連想配列のいずれかを使用したい場合。

配列で、あなたはインデックスを指定していないので、PHPを指標と配列の長さを使用するため、

あなたは異なる動作を取得している理由としては、それです。オブジェクトを使用すると、(この場合は「A」で)名前を指定する必要があります。

あなたがやりたいことがあり、他の事は配列であるメンバーで、オブジェクトを持っています

$obj = new stdClass;
$obj->arr = array();
$obj->arr[] = 'foo';
$obj->arr[] = 'bar';

また、あなたがオブジェクトに配列をキャストすることができます忘れないでください。

$obj = (object) array(
    'arr' => array(
        'foo',
        'bar'
    )
);

のみOOPのために、クラスを使用しないでください。あなたは本当にこの機能を実装したい場合は、このクラスを使用します:

class ArrayClass
{
    protected $storage = array();

    public function push($content) {
        $this->storage[] = $content;
        return $this;
    }

    public function get($index) {
        if (isset($this->storage[$index])) {
            return $this->storage[$index];
        } else {
            //throw an error or
            return false;
        }
    }
}

あなたはJavaScriptで正確にこれを取得することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top