从未知对象属性构建数组

时间:2012-01-23 15:50:13

标签: php arrays oop

我试图用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                                                      
    );        
}

上述代码不起作用,但希望它说明了我想要做的事情。任何帮助将不胜感激,谢谢!

4 个答案:

答案 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)

您可以在包含属性的对象中创建一个数组:

$objVariants->attr['pid']

你也可以使用magic methods使对象数组像。

答案 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'];
  }
}