2012-03-06 18 views
7

からPHPでオブジェクトを塗りつぶすんが、私が持っていると仮定します。どのように配列

class A{ 
public $one; 
public $two; 
} 

と値を持つ配列:

array('one' => 234, 'two' => 2) 

がでいっぱいのインスタンスを持つ方法があります配列から自動的に正しい値が得られますか?

+0

※自動的に*を定義してください。 'A'のインスタンスは既に存在するのでしょうか、それとも作成する必要がありますか?はいの場合は、そのインスタンスのコンストラクタを呼び出すかどうかを指定します。 – hakre

+1

[PHP:配列をStdClassオブジェクトに変換する方法]の重複? http://stackoverflow.com/questions/1885160/php-how-to-turn-an-array-into-a-stdclass-object –

+0

@ Rob2211:私も検索しましたが、「A」は「StdClass」ではありません。 – hakre

答えて

13

あなた自身のために関数を書く必要があります。 PHPはget_object_varsDocsを持っていますが、何の相手方設定されていない:

function set_object_vars($object, array $vars) { 
    $has = get_object_vars($object); 
    foreach ($has as $name => $oldValue) { 
     $object->$name = isset($vars[$name]) ? $vars[$name] : NULL; 
    } 
} 

使用法:

$a = new A(); 
$vars = array('one' => 234, 'two' => 2); 
set_object_vars($a, $vars); 
+0

ブリリアント!他の2次元のステップで同じ効果を得るには、何を変更する必要がありますか? $ object ['x'] ['y'] ['z']; –

0

はいあります。

はパススルー方式を使用できます。例えば

:あなたは、属性の一括設定を可能にしたい場合は

class A { 
    public $one, $tow; 
    function __construct($values) { 
     $this->one = $values['one'] ?: null; 
     $this->two = $values['two'] ?: null; 
    } 
} 

$a = new A(array('one' => 234, 'two' => 2)); 
+0

ほとんど自動です。 –

+0

@ Rob2211本当ですが、それは私が考えることができる最高です。 – Neal

2

、あなたはまた、プロパティとして保存することができます。それはあなたが少し良いクラス内でカプセル化することができます。

class A{ 
    protected $attributes = array(); 
    function setAttributes($attributes){ 
    $this->attributes = $attributes; 
    } 

    public function __get($key){ 
    return $this->attributes[$key]; 
    } 

} 
1

@hakreバージョンは(IDまたはパスワードがthoses小道具であると仮定)かなり良いが、危険です。

私はそれにデフォルトの動作を変更します:ここに

function set_object_vars($object, array $vars) { 
    $has = get_object_vars($object); 
    foreach ($has as $name => $oldValue) {   
     array_key_exists($vars[$name]) ? $object->$name =$vars[$name] : NULL; 
    } 
} 

を、$ VARS配列に含まれていない以前の性質は影響を受けません。
小物をに設定したい場合は、にすることができます。

関連する問題