4

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

場所は次のようになります。

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

値を見つける必要があったコードは次のとおりです。

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];

ありがとう

4

4 に答える 4

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 これは実際の配列に渡されるので、その場で変更できます。それ以外の場合は、コピーを渡すだけです。

于 2012-05-10T19:11:40.037 に答える
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';
于 2012-05-10T19:04:50.673 に答える
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'
于 2012-05-10T19:11:06.357 に答える
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);
于 2012-05-10T19:20:48.893 に答える