【发布时间】:2015-02-02 05:28:44
【问题描述】:
说,我有一个树结构中的数据,实现为任意深度的数组数组,类似于
print_r($my_array);
Array
(
[id] => 123
[value] => Hello, World!
[child] => Array
(
[name] => Foo
[bar] => baz
)
[otherchild] => Array
(
[status] => fubar
[list] => Array
(
[one] => 1
[two] => 3
)
)
[sanity] => unchecked
)
现在,使用单个字符串作为键,我想在任意深度寻址一个节点,假设我有一个这样的键:
$key = 'otherchild|list|two';
使用这个键我希望能够处理存储在中的值
$my_array['otherchild']['list']['two']
显然,我可以explode('|', $key) 来获取一个键数组,然后将值从其中移出并使用它们来寻址子数组,这样就可以轻松获得我正在寻找的值,某事喜欢
$value = $my_array;
$keys = explode('|', $key);
while ($k = array_shift($keys)) {
if (isset($value[$k])) {
$value = $value[$k];
} else {
// handle failure
}
} // Here, if all keys exist, $value holds value of addressed node
但我一直在尝试以通用方式更新值,即不必求助于类似
$keys = explode('|', $key);
if (count($keys) == 1) {
$my_array[$keys[0]] = $new_value;
} else if (count($keys) == 2) {
$my_array[$keys[0]][$keys[1]] = $new_value;
} else if ...
有什么想法吗?
【问题讨论】:
-
您可以使用参考文献和与您在阅读时使用的方法类似的方法。当找不到节点时,只需创建它并继续。