2012-05-10 13 views
4

非常に大きな多次元配列に値の場所を含む配列があります。私はこの場所を取って、その場所の値を別の値に置き換える必要があります。再帰関数を記述することで、このようなインデックスの配列を使用して位置の値を返すことに関する多くの記事を見つけました。しかし、私は大きな配列をスライスすることができないので、これはうまくいきません。ただ一つの値を置き換える必要があります。私はこれまでの修正だろうか値のインデックスが与えられた多次元配列の値を置換する

function replace_value($indexes, $array, $replacement){ 
    if(count($indexes) > 1) 
     return replace_value(array_slice($indexes, 1), $array[$indexes[0]], $replacement); 
    else 
     return $array[$indexes[0]]; 
    } 
} 

の代わりに、再帰的配列を伐採:以下

array(1,5,3,4,6); 

私は値を見つけなければならなかったコードされています

場所は次のようになります値が見つかるまで、私は単純に大きな配列の一部を変更できますか?

array(1,5,3,4,6); 

の中へ

$array[1][5][3][4][6]; 

おかげで、あなたの配列のインデックスを含む変数の内容を信頼と仮定

答えて

5

あなたはこのようなあなたの機能を変更することができます:

function replace_value($indexes, &$array, $replacement){ 
    if(count($indexes) > 1) { 
     return replace_value(array_slice($indexes, 1), $array[$indexes[0]], $replacement); 
    } else { 
     return $array[$indexes[0]] = $replacement; 
    } 
} 

は、関数定義の&$arrayあなたの書き込みを確認してください、ない$arrayあなたの場所でそれを変更できるように、これは、実際の配列を渡します。それ以外の場合は、コピーを渡すだけです。

+0

else文の最後に余分なものがある以外は魅力的です。 – Chris

+0

ああ、ありがとう@chris。一定。 – declan

3

を構築する方法がありますが、これはevalの完全に有効な使用は次のとおりです。

$keys = array(1,5,3,4,6); 

$keys = "[" . join($keys, "][") . "]"; 

$value = "what"; 

eval("\$array$keys = '$value';"); # $array[1][5][3][4][6] = 'what'; 
+0

+1は、私はよくそれはだ...私は「あなたは、配列のインデックスを含む変数の内容を信頼と仮定すると、」()$値 – goat

+0

をでvar_exportだろうが、(それは簡単で、効果的な、明確なコードになり)同意します'eval'の全体の問題はそうではありませんか? – Madbreaks

+0

@Madbreaksあなたは深刻ですか?それは馬鹿ではない。あなたはそれを信じているか、そうではないのですか、あなたが知りません*あなたは悪いプログラマーです。 – meagar

1

これはevalを使用しないソリューションです。あなたが行くように各キーを通り、配列を減らしてください。下の変数$refは元の配列への参照ですので、元の配列を変更すると元の配列に変更されます。

$keys = array(1,5,3,4,6); 
$array[1][5][3][4][6] = 'foo'; 
$ref = &$array; 

foreach($keys as $key) { 
    $ref = &$ref[ $key ]; 
} 

$ref = 'bar'; 

echo $array[1][5][3][4][6]; // 'bar' 
0

これはテストされていません。私は彼らが特に混乱していると思うので、リファレンスを使用することを恥ずかしく思う傾向があります。バグを見つけにくくなる可能性のあるレファレンスをコード内に残します。

$keys = array(1,5,3,4,6); 
$path = 'new leaf value'; 
foreach (array_reverse($keys) as $key) { 
    $path = array($key => $path); 
} 

$modified = array_replace_recursive($origionalArray, $path); 
関連する問題