访问数组中对象的值

时间:2012-08-26 18:26:44

标签: php oop

考虑以下对象数组:

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";
}

访问对象的另一个例子,这次是为了占领Ringo:

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

我想我可以编写一个People类,它将每个Person对象存储在一个内部数组中,并提供更改或读取占用的函数,但如果PHP有更聪明的构建,我很想知道。

感谢。

2 个答案:

答案 0 :(得分:2)

为什么不只是将元素的键设置为名称?

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

答案 1 :(得分: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'