日記
やっぱりダメだった (11:39)Edit

リファレンス変数の動作イメージがきちんと理解できていないな。配列と絡むとさらに混乱度倍。

要は、

function &getNode(&$tree, $path)
{
$node =& $tree;
foreach (explode('/', $path) as $key) {
if ($key == '') {continue;}
if (!isset($node[$key])) {
$node[$key] = NULL;
}
$node =& $node[$key];
}
return $node;
}
function setNode(&$tree, $path, $value)
{
$node =& getNode($tree, $path);
$node = $value;
}
function setNodeByRef(&$tree, $path, &$value)
{
$node =& getNode($tree, $path);
$node =& $value;
}
$tree = array(
1 => array(
11 => 11,
12 => 12,
),
2 => array(
21 => 21
),
);
$a = 'a';
print_r($tree);
setNode($tree, '1/11', $a);
print_r($tree);
setNodeByRef($tree, '1/12', $a);
print_r($tree);
$a = 'A';
print_r($tree);

なんてことをしたかったんだけど、これだとsetNodeByRefしても、指定したノードに$aのリファレンスが代入されない。

function setNodeByRef(&$tree, $path, &$value)
{
$node =& $tree;
$keys = explode('/', $path);
$lastkey = array_pop($keys);
foreach ($keys as $key) {
if ($key == '') {continue;}
if (!isset($node[$key])) {
$node[$key] = NULL;
}
$node =& $node[$key];
}
$node[$lastkey] =& $value;
}

みたいにすれば大丈夫だけど。

Published At2005-09-08 00:00Updated At2005-09-08 00:00