考虑以下对象数组:
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有更聪明的构建,我很想知道。
感谢。
答案 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'