2013-02-17 119 views
1

我沒有使用PHP幾年 - 我的重點主要是C,C++,Objective-C,Ruby & ECMAScript。我正在用一些其他語言進行實驗,從而讓我的頭腦保持新鮮。PHP:函數像數組構造函數

我碰到一個例子就是在鑄造陣列PHP.net爲對象,以使訪問它的關鍵,如果他們的實例變量的值:

$obj = (object)array('foo' => 'bar', 'property' => 'value');

作爲練習,我想創建一個函數,其採用與array相同的參數,並將已經轉換爲對象的「數組」返回。類似於:

function o_array(\* variable amount of key=>value args like array()*\) 
{ 
    return (object)array.call(self, arguments); 
} 

我不知道如何構建一個函數,該函數在PHP中採用可變數量的key => value參數。預先感謝您的建議。

UPDATE
我希望在今後的以下變化,因爲我看到PHP的主要力量作爲它的靈活性和通用瘋狂(也是其弱點)。不支持命名參數: PHP language meeting regarding named params among other items.

+0

你看過'array_merge()'嗎? - http://php.net/array_merge – Tigger 2013-02-17 09:21:56

+0

我一直在尋找命名參數,這顯然不在PHP中存在,即使他們在'array'函數中使用它們。遊民。我現在已經如何將數組轉換爲對象,或將數組轉換爲對象。絕對不會嘗試合併數組。不知道從哪裏來。 – 2013-02-17 09:24:25

回答

1

PHP不允許命名參數,所以這是不可能的。陣列是不是功能,而是一個語言結構,這就是爲什麼它是你可以使用鍵值分配唯一的地方

+0

http://www.php.net/~derick/meeting-notes.html#named-parameters – 2013-02-17 09:26:40

+0

即使使用命名參數,它也不會工作,因爲函數仍然可能必須定義它所期望的參數名稱 – Dracony 2013-02-17 17:48:18

+0

這是正確的@Dracony。基本上我需要命名參數和http://php.net/func-get-args的版本,它們可以通過鍵而不是索引訪問參數。他們已經在一定程度上爲數組函數實現了它,但是我們僅僅因爲編寫我們自己的函數而無法訪問它。 – 2013-02-17 19:52:57

2

的參數變量量是可能的func_get_args

function f() 
{ 
    $args = func_get_args(); 
    // ... 
} 

但有沒有這樣的東西「key =>值參數」用於函數。所以,你可以只有一句,是將它們作爲陣列(這使得整個函數那種毫無意義的):

function arrayToObject(array $from) 
{ 
    return (object)$from; 
} 
+0

+1 我接受了@Dracony,因爲它對於未來遇到問題的程序員來說很直接。你提到了同樣的語言限制。謝謝。 – 2013-02-17 09:29:12

0

聽起來你正試圖轉換到數組對象。如果這是這裏的情況下的東西,你可以這樣做:

function array_to_object($array) { 
    $obj = new stdClass; 
    foreach($array as $k => $v) { 
    if(is_array($v)) { 
     $obj->{$k} = $this->array_to_object($v); 
    } else { 
     $obj->{$k} = $v; 
    } 
    } 
    return $obj; 
} 

所以,如果你有以下陣列:

$a = array('foo' => 'bar', 'property' => 'value'); 

轉換會導致用:

$o = array_to_object($a); 
echo ($o->foo); // will print 'bar' 
0

在我的理解,我認爲這是最明智的做法。

class Array() 
{ 
    public $array = array('foo' => 'bar', 'property' => 'value'); 
} 

//initiate an object... 
    $obj = new Array(); 
    $array = array_values($obj->array); 
    print_r($array); //will print 'bar' and 'value' 
} 
+0

雖然這不允許您擁有動態數組內容。問題是能夠將'array'方法等命名參數傳遞給另一個返回對象的新方法。 – 2013-02-17 12:24:34