Re: RE: Removing Items from an Array

From: Date: Thu, 13 Oct 2005 19:53:05 +0000
Subject: Re: RE: Removing Items from an Array
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-224081@lists.php.net to get a copy of this message
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-----------------


« previous php.general (#224081) next »