1

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」を変更できることを知っています、

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

助けに感謝します:)

ダン

4

6 に答える 6

5

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

配列を使用するだけでは問題を無限に解決できない理由はありますか、それともこれは単なる願いです。

編集:詳細については、この質問を確認してください。

于 2010-01-07T18:21:51.550 に答える
4

いいえ、できません。このように角かっこ([])を使用することは、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);
于 2010-01-07T18:29:00.193 に答える
1

私はあなたが何をしようとしているのか本当にわかりません

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

フィールドをオブジェクトに単純に「プッシュ」することはできません。とにかく値を取得するには、フィールドの名前を知っている必要があるため、ほとんど意味がありません。

于 2010-01-07T18:24:11.607 に答える
1

オブジェクトは配列ではありません。数値でインデックス付けされた要素が必要な場合は、配列を使用してください。

名前付き要素が必要な場合は、オブジェクトまたは連想配列のいずれかを使用します。

異なる動作をする理由については、配列ではインデックスを指定していないため、PHPは配列の長さをインデックスとして使用します。オブジェクトでは、名前(この場合は「a」)を指定する必要があります。

あなたがしたいと思うかもしれない他のことは、配列であるメンバーを持つオブジェクトを持つことです:

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

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

$obj = (object) array(
    'arr' => array(
        'foo',
        'bar'
    )
);
于 2010-01-07T18:24:57.800 に答える
0

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;
        }
    }
}
于 2010-01-07T18:22:39.020 に答える
-1

これはJavaScriptで正確に取得できます。

于 2013-07-31T06:30:57.093 に答える