Reply to Re: [PHP] RE: Removing Items from an Array

Your name:

Reply:


Posted by Jochem Maas on 10/13/05 22:53

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-----------------
>

[Back to original message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация