RE: RE: Removing Items from an Array

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Blimey...

That's going to take some de-ciphering... It looks fascinating :-)

Thanks!

Alan

> -----Original Message-----
> From: Jochem Maas [mailto:jochem@xxxxxxxxxxxxx] 
> Sent: 13 October 2005 20:53
> To: Alan Lord
> Cc: php-general@xxxxxxxxxxxxx
> Subject: Re:  RE: Removing Items from an Array
> 
> 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


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux