我试图用PHP中的Object构建一个数组。我只想要对象的某些属性,但我不知道每次都会有什么属性。我需要的属性的名称存储在一个数组中。以下是我的代码目前的工作方式:
// Hard-coded attributes 'colour' and 'size'
while ($objVariants->next())
{
$arrVariants[] = array
(
'pid' => $objVariants->pid,
'size' => $objVariants->size,
'colour' => $objVariants->colour,
'price' => $objVariants->price
);
}
我想使用变量来代替硬编码属性(颜色和大小),这是因为它可能并不总是颜色和大小,具体取决于用户在CMS中设置的内容。例如:
$arrVariantAttr = $this->getVariantAttr(); // Get the names of the custom variants and put them in an array e.g colour, size
while ($objVariants->next())
{
$arrVariants[] = array
(
'pid' => $objVariants->pid,
foreach($arrVariantAttr as $attr)
{
$attr['name'] => $objVariants-> . $attr['name']; // Get each variant out of the object and put into an array
}
'price' => $objVariants->price
);
}
上述代码不起作用,但希望它说明了我想要做的事情。任何帮助将不胜感激,谢谢!
答案 0 :(得分:2)
您可以使用get_object_vars()
获取对象的所有变量:
$arrVariants[] = get_object_vars($objVariants);
为了从对象中排除特定属性,您可以这样做:
$arrVariants = get_object_vars($objVariants);
// array containing object properties to exclude
$exclude = array('name');
// walk over array and unset keys located in the exclude array
array_walk($arrVariants, function($val,$key) use(&$arrVariants, $exclude) {
if(in_array($key, $exclude)) {
unset($arrVariants[$key]);
}
});
答案 1 :(得分:1)
答案 2 :(得分:1)
听起来你真正想要的是子类或工厂模式。
例如,您可以拥有一个基本的产品对象
class Product {
protected $_id;
protected $_sku;
protected $_name;
...
etc.
//getters and setters
etc.
}
...然后使用子类来扩展该产品
final class Book extends Product {
private $_isbn;
private $_language;
private $_numPages;
...
etc.
public function __construct() {
parent::__construct();
}
//getters and setters
etc.
}
通过这种方式,您的产品类型具有所需的所有属性,您无需尝试使用“属性”数组 - 尽管您的CMS需要能够支持产品类型(如果有人想要添加一本新书,与书籍相关的字段出现在CMS中... ...这只是一个稍微更好的方法来解决问题。
然后你可以对它进行工厂模式化;像(一个真的基本例子):
class ProductFactory {
const TYPE_BOOK = 'Book';
const TYPE_CD = 'CD';
const TYPE_DVD = 'DVD';
...
etc.
public static function createProduct($sProductType) {
if(class_exists($sProductType)) {
return new $sProductType();
}
else {
//throw an exception
}
}
}
然后,您可以使用以下内容生成新产品:
$oWarAndPeace = ProductFactory::createProduct('Book')
或更好:
$oWarAndPeace = ProductFactory::createProduct(ProductFactory::TYPE_BOOK)
答案 3 :(得分:0)
尝试这样的事情:
$arrVariants[] = Array(
'pid' => $objVariants->pid,
'price' => $objVariants->price
);
while( $objVariants->next() )
{
foreach( $arrVariantAttr as $attr )
{
end($arrVariants)[$attr['name']] = $objVariants->$attr['name'];
}
}