2012-01-23 2 views
3

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              
    );   
} 

대신의 속성 (색상 및 크기) I 변수를 사용하려면 코딩 하드, 이것이다 : 내 코드는 현재 어떻게 작동하는지 여기입니다 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

'당신은 다음과 같은 새로운 제품을 생성 할 수 있습니다

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

구문 분석 오류 : 예기치 않은 구문 오류 '[' ' – DaveRandom

+0

감사합니다. 내 문제를 해결할 수있게 도와 줬어. – jd182

1

당신은 속성을 포함하는 객체의 배열을 만들 수는 :

$objVariants->attr['pid'] 

당신은 또한 당신과 같은 배열을 반대하기 위해 magic methods를 사용할 수 있습니다.

2

당신은 객체의 모든 변수를 얻을 수 get_object_vars()을 사용할 수

$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

알아두면 좋지만,이 경우 특정 속성 만 필요합니다. Object에는 필요없는 다른 객체가 포함되어 있습니다. – jd182

+0

@JamieDevine - get_objects_vars()에서 반환 된 배열에서 특정 변수를 제거하는 코드를 추가했습니다. – Cyclonecode

1

그것은 당신이 무엇을 같은 소리 :이 같이 할 수있는 객체의 특정 속성을 배제하기 위해

$arrVariants[] = get_object_vars($objVariants); 

을 정말 원하는 하위 클래스 또는 공장 패턴입니다.

는 예를 들어 당신은 제품의 기본 객체

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) ... 그것은 문제에 대한 좀 더 많은 OO 접근 방식입니다.

그런 다음 공장에서 패턴을 지정할 수 있습니다. 같은의 (a 정말 기본 예제) : 더 나은 아직

$oWarAndPeace = ProductFactory::createProduct('Book')

나 :

$oWarAndPeace = ProductFactory::createProduct(ProductFactory::TYPE_BOOK)

+0

답변 주셔서 감사합니다. 저는이 경우 전자 상거래 시스템의 틀 내에서 작업 중이므로 클래스와 객체 구조를 사용해야합니다. – jd182

+0

버머 - 다음 다른 사람의 응답에 foreach 루프 중 하나가 될거야 :) – CD001

+0

여전히 나에게서 좋은 대답을 +1 받으십시오;) – PiTheNumber

관련 문제