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

有什么快速访问对象的方法吗?如果另一种数据类型可以使访问更容易,我不介意将它们存储在不同的数据类型(而不是数组)中。

访问对象的示例:我现在想将“保罗”对象更改为歌手的职业。这是当前的解决方案:

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 有任何更聪明的构建,我很想知道。

谢谢。

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 回答