我有一个包含大约30个设置的对象。 1页可以包含10个对象,每个对象最多15个设置。 为了初始化对象,我从数据库中为每个对象获取一个关联数组。 我想知道什么是最好的表现?我目前有(例子):
$object = new element_class();
$array = <query from database>
//Reinitialize object to remove any set values of object properties to null
foreach($object as $key=>$value)
{
$object->$key = null;
}
//Switch of array to set the values in the array in the object properties
foreach($array as $key=>$value)
{
switch($key)
{
case 'a':
$this->property_a = $value;
break;
case 'b':
$this->property_b = $value;
break;
case 'c':
$this->property_c = $value;
break;
case 'd':
$this->property_d = $value;
break;
etc....
}
}
//Default section to set necessary properties if not in database array
foreach($object as $key=>$value)
{
if($value == null)
{
switch ($key)
{
case 'property_a':
$object->$key = <any value here>;
break;
case 'property_b':
$object->$key = <any value here>;
break;
case 'property_c':
$object->$key = <any value here>;
break;
etc.....
}
}
}
这3个步骤有更快的方法吗? 任何性能提升都是受欢迎的,特别是因为它有很多......
很抱歉,如果脚本中有错误,我从头开始输入,我没有代码atm
答案 0 :(得分:2)
代替switch
,您可以使用变量属性,假设属性名称和关联数组的键之间存在一致的模式。
$this->{"property_" . $key} = $value;
另一种选择是将所有设置存储在包含关联数组的单个属性中。然后你可以这样做:
$this->settings = $array;
答案 1 :(得分:2)
此
$object = new element_class();
//Reinitialize object to remove any set values of object properties to null
foreach($object as $key=>$value)
$object->$key = null;
可以替换为
$object = new element_class();
假设您定义public $field
s,默认情况下初始化为null
。
此
$array = <query from database>
//Switch of array to set the values in the array in the object properties
foreach($array as $key=>$value)
{
switch($key)
{
case 'a':
$this->property_a = $value;
break;
case 'b':
$this->property_b = $value;
break;
case 'c':
$this->property_c = $value;
break;
case 'd':
$this->property_d = $value;
break;
etc....
}
}
可以替换为
$settings = (object) $array;
它将设置与$this
分开,因此您可以轻松保存它们。
此
//Default section to set necessary properties if not in database array
foreach($object as $key=>$value)
if($value == null)
switch ($key)
{
case 'property_a':
$object->$key = <any value here>;
break;
case 'property_b':
$object->$key = <any value here>;
break;
case 'property_c':
$object->$key = <any value here>;
break;
etc.....
}
应该由element_class()
构造函数完成,如下所示:
class element_class {
public $a = <any value here>;
public $b = <any value here>;
....
}
然后你消除null
循环(或者用设置默认值代替它),你所要做的就是用<query>
提取的值覆盖它们。
这是使用php的原生array_merge
:
$defaults = [
'a' => <any value here>,
'b' => <any value here>,
...
];
$array = <query>;
$settings = (object) array_merge( $defaults, $array );
我不知道它是否更快,但它更容易维护。 如果存在任何速度问题,则应该使用 SQL查询数。你说你有&#34; 10&#34; 对象,每个对象都有&#34; 15 &#34;行。通过使 1 查询返回 150 对象,您可以获得更高的速度增益。