Alan Lord wrote:
Hi TG and others,
I think I must be missing something here.
Your example doesn't seem to traverse "down" into a multidim array.
Also, it appears as though your script assumes that the structure of the
array is known. It isn't and it is retrieved from "far away" and I have
no control over it's structure/depth/size etc... I can take a good guess
at the keys I want to keep and keep those in an array in my config.inc.
But I would ideally like to be able to have a function which is as
"array agnostic" as possible.
shouldn't be 'array paragnostic' or maybe 'array gnostic' -
psychic hypertext processor. does what you mean.
I tried to do an "unset($arr[key])" in one of my other attempts at
solving this problem. But from what I read in the manual (if I
understood correctly :-)), it seems as though you can't really do this
from within a function/routine which is walking through the array at
that time as the array is not re-ordered...
right so you have to write your own function. and/or maybe combine it with
array_map() and/or array_filter() ... here is a routine that drills
into an array given an array of values that act as the 'path'
into the array your 'drilling' (can you handle php5?), may be that
inspires you a bit:
/*
* eg
$yourDataSet = array();
$yourDataSet['A'] = array();
$yourDataSet['B'] = array();
$yourDataSet['A']['A'] = array();
$yourDataSet['B']['B'] = array();
$yourDataSet['B']['B']['coolstuff'] = array(
'foo' => 'bar',
'bar' => 'qux',
);
ArrayDriller::setSource( $yourDataSet );
$somedata = ArrayDriller::get( array('B','B','coolstuff') )
*/
class ArrayDriller
{
static private $source;
static public function setSource($var)
{
// do a check to make sure the keys are associative?
if (is_array($var) && count($var)) self::$source = $var;
}
static public function set($varName, $value = null)
{
if (is_array(self::$source) && $varName && !is_numeric($varName)) {
if (is_array( $varName )) {
$tmpArr =& self::$source;
while ( 1 ) {
self::chkVarName($k = array_shift( $varName ));
if ( !count( $varName )) {
return ($tmpArr[ $k ] = $value);
break;
} else if (! isset($tmpArr[ $k ]) || ! is_array($tmpArr[ $k ])) {
$tmpArr[ $k ] = array();
}
$tmpArr =& $tmpArr[ $k ];
}
} else {
self::chkVarName($varName);
return (self::$source[ $varName ] = $value);
}
}
}
static public function get($varName)
{
if (is_array(self::$source) && $varName) {
if (is_array( $varName )) {
$tmpArr =& self::$source;
while ( 1 ) {
self::chkVarName($k = array_shift( $varName ));
/* endpoint */
if ( !count( $varName )) {
if (@is_array($tmpArr) && array_key_exists($k, $tmpArr)) {
return $tmpArr[ $k ];
}
break;
}
else if (!array_key_exists($k, $tmpArr) ||
!is_array($tmpArr[ $k ]))
{
// we can go no deeper
break;
}
$tmpArr =& $tmpArr[ $k ];
}
} else {
self::chkVarName( $varName );
if (array_key_exists($varName, self::$source)) {
return self::$source[ $varName ];
}
}
}
return null;
}
static private function chkVarName($varName)
{
if (strval( $varName )) {
return;
} else {
throw new Exception('backup buster, call that an assoc key?');
// trigger_error(); // er? php4 anyone?
}
}
}
Thanks and no offence intended, I am just trying to understand... :-)
Alan
--
Tg wrote:
That works just as well, if you have only two levels of depth. Mostly I
was trying to illustrate how to use $key => $value in a foreach and what
to do if you need to go multiple levels down. Once you get to the
bottom level, then you can use isset() certainly.
Just wanted to make sure that it was clear what to do with $key and
$subkey relating to the main array ($alldataarr in this example)
---------snip-----------------
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php