Создание массива из неизвестных свойств объекта - PullRequest
3 голосов
/ 23 января 2012

Я пытаюсь построить массив из объекта в PHP.Мне нужны только определенные свойства объекта, но я не знаю, какими они будут каждый раз.Имена нужных мне свойств хранятся в массиве.Вот как мой код работает в настоящее время:

// 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 ]

2 голосов
/ 23 января 2012

Вы можете использовать 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 голос
/ 23 января 2012

Похоже, что вы действительно хотите, это подклассы или шаблон фабрики.

Например, вы можете иметь базовый объект продукта

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)

1 голос
/ 23 января 2012

Вы можете создать в объекте массив, содержащий атрибуты:

$objVariants->attr['pid']

Вы также можете использовать магические методы , чтобы сделать ваш массив объектов похожим на.

0 голосов
/ 23 января 2012

Попробуйте что-то вроде этого:

$arrVariants[] = Array(
  'pid' => $objVariants->pid,
  'price' => $objVariants->price
);

while( $objVariants->next() )
{
  foreach( $arrVariantAttr as $attr )
  {
    end($arrVariants)[$attr['name']] = $objVariants->$attr['name'];
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...