次の機能があるとします
function setArray(&$array, $key, $value)
{
$array[$key] = $value;
}
上記の関数ではキーは1段目のみですが、2段目や3段目にキーを設定したい場合、関数をどのように書き換えればよいでしょうか?
例えば
$array['foo']['bar'] = 'test';
同じ関数を使用して配列値を設定したい
次の機能があるとします
function setArray(&$array, $key, $value)
{
$array[$key] = $value;
}
上記の関数ではキーは1段目のみですが、2段目や3段目にキーを設定したい場合、関数をどのように書き換えればよいでしょうか?
例えば
$array['foo']['bar'] = 'test';
同じ関数を使用して配列値を設定したい
これはうまくいくはずです。この関数を使用すると、次のように区切られたキーを含む単一の文字列を渡すことで、任意の深さの任意の配列要素を設定できます。.
function setArray(&$array, $keys, $value) {
$keys = explode(".", $keys);
$current = &$array;
foreach($keys as $key) {
$current = &$current[$key];
}
$current = $value;
}
これは次のように使用できます。
$array = Array();
setArray($array, "key", Array('value' => 2));
setArray($array, "key.test.value", 3);
print_r($array);
出力:
Array (
[key] => Array
(
[value] => 2
[test] => Array
(
[value] => 3
)
)
)
使用できますarray_merge_recursive
$array = array("A" => "B");
$new['foo']['bar'] = 'test';
setArray($array, $new);
var_dump($array);
出力
array (size=2)
'A' => string 'B' (length=1)
'foo' =>
array (size=1)
'bar' => string 'test' (length=4)
使用する機能
function setArray(&$array, $value) {
$array = array_merge_recursive($array, $value);
}
この関数はそれを行う必要があり、キーは配列である必要があります。たとえば、array('foo', 'bar')
function setArray(&$array, array $keys, $value) {
foreach($keys as $key) {
if(!isset($array[$key])) {
$array[$key] = array();
}
$array = &$array[$key];
}
$array = $value;
}
$arr = array();
setArray($arr, array('first', 'second'), 1);
var_dump($arr);
// dumps array(1) { ["first"]=> array(1) { ["second"]=> int(1) } }
テスト済みで動作します。
ちょうどこのような:
function setArray(&$array, $key1, $key2, $value)
{
$array[$key1][$key2] = $value;
}
しかし、なぜ関数を使いたいのでしょうか? 次のように使用します。
setArray($array, 'foo', 'bar', 'test');
次のようなものを書くには、より多くの時間がかかります。
$array[1][2] = 'test';