2012-08-25 46 views
0

創建嵌套的對象我有這樣的代碼,用於初始化配置如何從嵌套數組,在PHP

$this->config = array(
     'users' => array(
      array('name' => 'admin', 
        'password' => $password 
      ) 
     ), 
     'tokens' => array(), 
     'sessions' => array(), 
    ); 

,我使用json_encode($this->config)保存到文件,後來我用加載它

json_decode(file_get_contents('file.json')); 

它創建嵌套的對象,我想這個嵌套的對象,當我初始化和配置,有沒有辦法創建這個嵌套的對象,然後呢?

$this->config = json_decode(json_encode($this->config)); 
+0

您希望您的陣列成爲物體,或更好的嵌套對象的集合? – moonwave99

+0

@ moonwave99是的,json_encode用於assoc數組''array('foo'=>'bar')'return'{「foo」:「bar」}'當您使用'json_decode('{「foo」: 「bar」}')'因此而不是'$ array ['foo']'你通過'$ array-> foo'訪問它 - json_decode創建'stdClass'的實例 – jcubic

+0

無論如何,爲什麼你不只是存儲你的數據對象明智的第一次,沒有傳遞給關聯數組? – moonwave99

回答

0

我決定使用此功能,而不是

function object($array) { 
    $object = new stdClass(); 
    foreach ($array as $k => $v) { 
     $object->$k = $v; 
    } 
    return $object; 
} 

,並明確調用它assoc命令陣列

$this->config = object(array(
    'users' => array(
     object(array(
      'name' => 'admin', 
      'password' => $password 
     )) 
    ), 
    'tokens' => array(), 
    'sessions' => array(), 
)); 

編輯遞歸碼

function is_assoc($array) { 
    if (!is_array($array)) { 
     return false; 
    } else { 
     $keys = array_keys($array); 
     return !is_numeric($keys[0]); 
    } 
} 

function object($array) { 
    if (is_assoc($array)) { 
     $object = new stdClass(); 
     foreach ($array as $k => $v) { 
      $object->$k = object($v); 
     } 
     return $object; 
    } else { 
     return $array; 
    } 
} 
+1

順便說一句,你不需要這樣做 - 只需將你的數組轉換爲object:'(object)($ this - > config)'來獲得你的自定義函數的功能。 – moonwave99

+0

@ moonwave99我不知道你可以投入職能。但是cast不是遞歸的,第二個函數只會從第一個數組創建對象。但無論如何,我決定放棄這個數組來實現目標。 – jcubic

1

您也可以使用此功能

<?php 
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

沒關係,但它擺脫了數字索引數組[例如在給定的例子中'用戶'數組],它應該保持爲對象的集合 - 只要檢查'$ name'是不是數字。 – moonwave99

+0

@ moonwave99是的,它應該檢查'is_integer(array_keys($ array)[0])'然後使用'return array_map('arrayToObject',$ array);' – jcubic