1

次のオブジェクトの配列について考えてみます。

class Person {
    public $name;
    public $occupation;
    public function __construct($n, $o){
        $this->name = $n;
        $this->occupation = $o;
    }
}

$people = array(
    new Person("John",   "singer"),
    new Person("Paul",   "guitar"),
    new Person("George", "bass"),
    new Person("Ringo",  "drums")
);

オブジェクトにすばやくアクセスする方法はありますか?別のデータ型でアクセスしやすくなる場合は、(配列ではなく)別のデータ型に格納してもかまいません。

オブジェクトへのアクセス例:「Paul」オブジェクトを歌手の職業に変更したいと思います。これが現在の解決策です。

foreach ( $people as &$p ) {
        if ( $p->name=="Paul" )
                $p->occupation="singer";
}

または、別のプロパティに基づいてアクセスする必要がある場合があります。すべての歌手の名前をYokoに変更しましょう。

foreach ( $people as &$p ) {
        if ( $p->occupation=="singer" )
                $p->="Yoko";
}

オブジェクトにアクセスする別の例、今回はリンゴの占領を得るために:

$ringosOccupation="";
foreach ( $people as $p ) {
        if ( $p->name=="Ringo" )
                $ringosOccupation = $p->occupation;
}

各Personオブジェクトを内部配列に格納し、職業を変更または読み取るための関数を提供するPeopleクラスを作成できると思いますが、PHPに何か賢いものが組み込まれている場合は、知りたいと思います。

ありがとう。

4

2 に答える 2

2

要素のキーを名前に設定しないのはなぜですか?

$people = array(
    'john'   => new Person("John",   "singer"),
    'paul'   => new Person("Paul",   "guitar"),
    'george' => new Person("George", "bass"),
    'ringo'  => new Person("Ringo",  "drums"),
);
于 2012-08-26T18:29:43.083 に答える
2

次の名前で配列にインデックスを付けるだけです。

$people = array(
    "John" => new Person("John",   "singer"),
    "Paul" => new Person("Paul",   "guitar"),
    "George" => new Person("George", "bass"),
    "Ringo" => new Person("Ringo",  "drums")
);

// Paul is the new drummer:
$people["Paul"]->occupation = "drums";

少しの冗長性が生まれますが、何かを変更する必要があるたびに必要なものを見つけるためにそれらすべてをループするよりも、冗長性がメモリや計算に集中することはありません。

アップデート:

質問が更新された後、名前が一意でないか、アクセスに必要な他のプロパティである可能性があることは明らかです。その場合、頻繁に行う必要がある場合は、データベースを使用してオブジェクトの状態を保存する方がよい場合があります。配列に一意のインデックスを付けることができない場合は、配列を反復処理する必要があります。データベースでこれらの変更を行うのは簡単ですが、常にオブジェクトを再構築する必要があります。

したがって、配列が大きすぎない場合は、これまでと同じようにループを続けてください。それがあなたのパフォーマンスのニーズを満たしているなら、それは大丈夫な方法です。変更するものがたくさんあり、頻繁に変更する場合は、データベースに保存し、オブジェクトを読み取る必要がある場合にのみオブジェクトを構築することをお勧めします。次に、次のことができます。

UPDATE people SET name = 'Yoko' WHERE occupation = 'singer'
于 2012-08-26T18:29:58.927 に答える