考虑以下对象数组:
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有更聪明的内置,我很想知道。
谢谢。
只需使用以下名称对数组进行索引:
$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'
为什么不直接将元素的键设置为名称?
$people = array(
'john' => new Person("John", "singer"),
'paul' => new Person("Paul", "guitar"),
'george' => new Person("George", "bass"),
'ringo' => new Person("Ringo", "drums"),
);