2012-01-23 4 views
3

Я пытаюсь построить массив из объекта в 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              
    );   
} 

Этот код не работает, но, надеюсь, он иллюстрирует то, что я пытаюсь сделать. Любая помощь будет оценена, спасибо!

ответ

0

попробовать что-то вроде этого:

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

while($objVariants->next()) 
{ 
    foreach($arrVariantAttr as $attr) 
    { 
    end($arrVariants)[$attr['name']] = $objVariants->$attr['name']; 
    } 
} 
+0

' Ошибка анализа: синтаксическая ошибка, неожиданная '[' ' – DaveRandom

+0

Спасибо, у этого есть h убедил меня решить мою проблему. – jd182

1

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

$objVariants->attr['pid'] 

Вы также можете использовать magic methods, чтобы вы возражаете массив как.

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]); 
    } 
}); 
+0

Полезно знать, но в этом случае я хочу только конкретные свойства. Объект содержит другие, которые мне не нужны. – jd182

+0

@JamieDevine - я добавил код, чтобы удалить определенные переменные из массива, полученного из 'get_objects_vars()'. – Cyclonecode

1

Это звучит так, как вы действительно нужны подклассы или шаблон Factory.

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

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. 
} 

Таким образом, ваши виды продукции имеют все атрибуты они и вам не нужно пытаться работать с массивом «attributes», хотя ваша 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)

+0

Спасибо за ответ, я работаю в рамках электронной коммерции в этом случае, поэтому мне нужно использовать класс и структуру объектов, которые есть. – jd182

+0

bummer - станет одной из циклов foreach в чьих-либо ответах, тогда :) – CD001

+0

все равно вы получите +1 за хороший ответ от меня;) – PiTheNumber

Смежные вопросы