2011-12-22 7 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())コードをすべて持っていないようにしたいrこのような場所。どのようにして元の配列が常に更新され、入れ子のレベルが変更されるようにするのですか?

& $ arrという配列を渡すのはPHP 5.3で許可されていないようです。私はこのエラーが発生します。 Call-time pass-by-reference has been deprecated

+0

なぜ機能がないのですか? $ arr [$ ia] [$ ib] = my_function(); ? – jValdron

+0

@jValdronしかし、関数は何を返すだろうか?元の配列が更新されることを確認する最良の方法は何ですか? – sameold

+0

あなたの関数は初期化を返すことができます: 'array( 'name' => array()、 'components' => array());'、おそらくちょうど質問を正しく理解していません:) – jValdron

答えて

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

関連する問題