2012-11-16 83 views
7

我開始擺脫使用PHP中的數組,因爲對象非常整潔,並且在php 5中使用對象時沒有性能命中。PHP寫入對象嵌入

目前我做的方式是:

$object = (object) array('this' => 'that', 'foo' => (object) array('bar' => 123));

不過,我覺得它很繁瑣不得不強制轉換每次爲鑄字心不是遞歸...

有什麼辦法在PHP的(或將有)做到這一點或類似的東西:

$object = { 
    'this' => 'that', 
    'foo' => { 
     'bar' => 123 
    } 
}; 
+5

爲什麼你想,當你創建一個數組反正使用對象? – Peon

+0

我不明白你需要這樣做。 – NappingRabbit

+1

你可以升級到php 5.4並使用短陣列語法;這會讓你的代碼更加整潔。我和@DainisAbols雖然;無論如何,我不確定你想要通過類型轉換來實現什麼。在這種情況下,您看到在數組上使用對象有什麼優勢? – SDC

回答

4

我建議你建立一個函數寬度StdClass

function arrayToObject($array) { 
    if(!is_array($array)) { 
     return $array; 
    } 

    $object = new stdClass(); 
    if (is_array($array) && count($array) > 0) { 
     foreach ($array as $name=>$value) { 
     $name = strtolower(trim($name)); 
     if (!empty($name)) { 
      $object->$name = arrayToObject($value); 
     } 
     } 
     return $object; 
    } 
    else { 
     return FALSE; 
    } 
} 
0

遺憾的是沒有語法創建stdClass情況那樣。但你可以使用new關鍵字和任何spl類(我承認沒有太多整數)。如果你想優化的按鍵,你可以寫一個小助手功能如下:

function O($a){ 
    return new ArrayObject($a); // has -> and [] support too 
} 

,寫

$stuff = O(array('a' => 'tickle me elmo', 'b' => O(array('foo' => 'bar')))); 
0

雖然我真的不能明白你爲什麼會想這樣做( 關聯數組在本質上僅數據對象),但如果你堅持:
相反鑄造的每一個陣列,在每一個層面一個對象,你可以使用下面的「把戲/黑客」

$object = json_decode(
       json_encode(
        array('some'=>array('multi'=>'Dimensional'), 
         'array'=>'that', 
         'you' => array('want' => 'to', 
             'turn' => 'into'), 
         'an' => 'object'))); 

這將所有陣列轉換爲stdClass的實例,我相信這是您想要的。
再說一遍,我不得不說:PHP是而不是 JavaScript和對象在像PHP這樣的語言中相對昂貴(相對而言),那麼它們在JS中。如果你不需要一個對象,我強烈建議你堅持使用assoc數組。

狀物體,數組可以是類型暗示function foo (array $argument){}
如果你真的想使他們成爲一些類的特定情況下,爲什麼不改變構造,對付一個數組:

class My_Object extends stdClass 
{ 
    public function __construct(array $params = null) 
    { 
     if (!empty($params)) 
     { 
      foreach ($params as $name => $value) 
      { 
       $this->{$name} = $value;//set everything 
      } 
     } 
    } 
} 

,並繼續添加要添加到不少

2

PHP目前不支持短對象語法什麼方法。從PHP 5.4開始,它們支持短陣列語法。也許5.5會包含你以後的內容。

作爲替代方案:

你可以精心的對象作爲JSON和使用json_decode()

$json = '{"this": "that", "foo": {"bar": 123}}'; 
var_dump(json_decode($json)); 

注:我只是顯示這個作爲的方式來解決你的問題的示範。我不主張這種做法。

+1

正確的代碼將是$ json ='{「this」:「that」,「foo」:{「bar」:123}}'; –

+0

謝謝。在那裏混合一點數組語法:) –

+0

不錯的答案,我會將它改爲像<<< JSON JSON; 只是爲了避免引用地獄 –

16

從PHP 5.4開始,短陣列語法已經可用。這允許你像這樣初始化數組:

$myArray = ["propertyA" => 1, "propertyB" => 2]; 

從PHP7開始,PHP中沒有當前的短對象語法。但是,你可以投短陣語法像這樣創建對象:

$myObject = (object) ["propertyA" => 1, "propertyB" => 2]; 

看起來比使用下面的結構更漂亮和更短:

$myObject = new \StdClass(); 
$myObject->propertyA = 1; 
$myObject->propertyB = 2; 
0

我有,當你收到一個已經建立了一種替代解決方案陣列。 假設你的數組有n個嵌套數組,所以你沒有機會以簡單的方式投射每一個數組。 這會做的伎倆:

$object = json_decode(json_encode($unknownArray)); 

我不會在一個大的循環或類似的東西用這個,因爲它不僅僅是與陣列sintax堅持與它生活的方式慢。 此外,如果數組的元素是一個函數或其他有趣的事情,這將打破這一點。

用法示例:

$unknownArray = array(
    'a' => '1', 
    'b' => '2', 
    'c' => '3', 
    'd' => array(
     'x' => '7', 
     'y' => '8', 
     'z' => '9', 
    ), 
); 
$object = json_decode(json_encode($unknownArray)); 
echo $object->d->x;