[pmwiki-devel] php multi-dimensional array construction problem
Hans
design5 at softflow.co.uk
Fri Feb 6 09:32:08 CST 2009
Friday, February 6, 2009, 2:16:15 AM, Patrick wrote:
> What happens with...?
> a:b:c = val1
> a:b = val2
> It would seem that array[a][b] can't simultaneously be a value and an array.
True. I would probably want to check if a value (or array) exists
before setting a new value, so it just gets added at the right level.
I like to thank everyone for their ideas! None worked for me, but I
got inspired by each response, and took something from it!
I think I got a solution I can share here now:
The functions make it possible to pass the keys either as array or as
string with ':' separators between the words.
For getting a node value the function cuts the array tree iteratively
smaller till the leaf node is left:
function TreeNodeGet($keys, $tree) {
if (!$keys) return null;
if (!is_array($keys))
$keys = explode(":", $keys);
while ($key = array_shift($keys)) {
if (!array_key_exists($key, $tree)) return null;
$tree = $tree[$key]; //reduce branch iteratively
}
return implode("",$tree); //node leaf
} //}}}
But I could not figure a way to use iterations for setting a new
value, I kept messing up the original array. So here I am using eval,
which should not pose problems with input restricted to safe
characters. This function will just overwrite an existing value:
function TreeNodeSet($keys, &$tree, $val) {
if (is_array($keys))
$keys = implode(":", $keys);
return eval( '$tree[\''.str_replace(':', '\'][\'', $keys).'\'] = $val; return true;');
} //}}}
Then to add some checks for preventing overwriting two more
functions, also using eval to pass the keys:
function TreeNodeExists($keys, $tree) {
if (is_array($keys)) $keys = implode(":", $keys);
return eval( 'if(isset($tree[\''.str_replace(':', '\'][\'', $keys).'\'])) return true; else return false;');
} //}}}
function TreeNodeIsArray($keys, $tree) {
if (is_array($keys)) $keys = implode(":", $keys);
return eval( 'if(is_array($tree[\''.str_replace(':', '\'][\'', $keys).'\'])) return true; else return false;');
} //}}}
There are probably better php solutions out there.
But stuff I found about iteration classes I could not understand.
Most info seems to be about accessing or writing hierarchical data
structures to a SQL db.
Hans
More information about the pmwiki-devel
mailing list