2011-12-22 23 views
0

我正在處理$ arr並且在我使用它之前經常需要檢查索引是否已「初始化」。如何更改數組,並將更改映射到原始數組

這些指標中的嵌套

$arr[$ia] 
$arr[$ia][$ib][$ic] 

水平不同,但我對它們進行初始化,它總是以同樣的方式

$arr[$ia]   = array('name'=>array(), 'components'=>array()); 
$arr[$ia][$ib][$ic] = array('name'=>array(), 'components'=>array()); 

我做的正是這樣

//if $arr[$ia] is not set, set it, then use it 
if(!isset($arr[$ia])){ 
    $arr[$ia] = array('name'=>array(), 'components'=>array()); 
} 
$arr[$ia]['name'] = 'some value'; 

or 

//if $arr[$ia][$ib] is not set, set it, then use it 
if(!isset($arr[$ia][$ib])){ 
    $arr[$ia][$ib] = array('name'=>array(), 'components'=>array()); 
} 
$arr[$ia][$ib]['name'] = 'some other value'; 

我想將初始化步驟移到一個方法中,所以我沒有array('name'=>array(), 'components'=>array())代碼像這樣的地方。我該如何做到這一點,以便原始數組始終得到更新,並且嵌套的級別會發生變化?

似乎將數組傳遞爲& $ arr在php 5.3中是不允許的。我得到這個錯誤。 Call-time pass-by-reference has been deprecated

+0

爲什麼沒有功能? $ arr [$ ia] [$ ib] = my_function(); ? – jValdron 2011-12-22 17:59:21

+0

@jValdron但函數將返回什麼?我的意思是確保原始數組得到更新的最佳方式是什麼? – sameold 2011-12-22 18:01:36

+0

你的函數可能會返回初始化:'array('name'=> array()''components'=> array());',我可能只是不明白這個問題:) – jValdron 2011-12-22 18:30:21

回答

1
function initArray(&$ar,$i) { 
    if (!isset($ar[$i])) $ar[$i]=array('name'=>array(), 'components'=>array()); 
} 

initArray(&$arr,$ia); 
$arr[$ia]['name'] = 'some value'; 

RESP。

ínitArray(&$arr[$ia],$ib); 
$arr[$ia][$ib]['name'] = 'some other value'; 

如果八方通指定的名稱,你可以皮條客這份長達

function initArrayName(&$ar, $i, $name) { 
    initArray(&$ar,$i); 
    $arr[$i]['name']=$name; 
} 

initArrayName(&$arr,$ia,'some value'); 

RESP。

ínitArrayName(&$arr[$ia],$ib,'some other value'); 
+0

+1但我'通過引用調用時傳遞已被棄用。我正在使用PHP 5.3。看起來他們做出了改變,所以這是不允許的。 – sameold 2011-12-22 18:19:54