RE: Removing Items from an Array - My Solution

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

 



Hi cc and others.

I have had quite a struggle with this. But finally, the end result looks
quite 
simple...

Here is the array of Keys Names I want to preserve:

$filter = array(
   'CategoryId' => 1, 'CategoryLevel' => 1, 'CategoryName' => 1,
'CategoryParentId' => 1
);

Here is the routine which (for ease, creates a new array containing only
the array 
keys contained in $filter:

foreach ($orig_arr as $key => $data) {

   if (is_array($data)) {
   foreach ($data as $subkey => $subdata) {
         if (isset($filter[$subkey])) {
         $sub_arr[$subkey] = $subdata;
         }
      }
   }
   $new_arr[] = $sub_arr;
}

$new_arr has just what I need :-)

This only works on a two dimensional array. But with a bit of tweaking
and turing 
into a function, it could probably be used on any number of dimensions
by making 
it recursive?

Thanks to the contributors who supplied ideas and knowledge..

If anyone thinks this could be done a better way, please feel free to
comment! 

Alan

> -----Original Message-----
> From: cc [mailto:nyvsld@xxxxxxxxx] 
> Sent: 13 October 2005 07:43
> To: Alan Lord
> Cc: php-general@xxxxxxxxxxxxx
> Subject: Re: Removing Items from an Array
> 
> could Alan give samples about the input and expected output 
> of the black box?
> then we can consider implement it.
> 
> On 10/13/05, Alan Lord <lord_alan@xxxxxxxxxxx> wrote:
> > Thanks for the replies gents.
> >
> > I have cludged together something from your solutions but 
> it isn't yet 
> > working. I've been staring at multi-dim arrays all day and 
> am getting 
> > tired, so I'll carry on tomorrow.
> >
> > Thanks again,
> >
> > Alan
> >
> > > -----Original Message-----
> > > From: Jochem Maas [mailto:jochem@xxxxxxxxxxxxx]
> > > Sent: 12 October 2005 19:18
> > > To: tg-php@xxxxxxxxxxxxxxxxxxxxxx
> > > Cc: php-general@xxxxxxxxxxxxx; lord_alan@xxxxxxxxxxx
> > > Subject: Re:  Removing Items from an Array
> > >
> > > Id like to continue where TG left off ...
> > >
> > > hth.
> > >
> > > tg-php@xxxxxxxxxxxxxxxxxxxxxx wrote:
> > > > If I understand what you're asking, then maybe this will help:
> > > >
> > > > $arrset1 = array("Apples" => 3, "Oranges" => 5, 
> "Apricots" => 1);
> > > > $arrset2 = array("Couches" => 6, "Chairs" => 2, "Benches" => 5);
> > > >
> > > > $alldataarr["Fruits"] = $arrset1;
> > > > $alldataarr["Furniture"] = $arrset2;
> > > >
> > > > Say we want to remove "Chairs", and let's do it the hard way:
> > > >
> > > > foreach ($alldataarr as $key => $data) {
> > > >   foreach ($data as $subkey => $subdata) {
> > > >     if ($subkey == "Chairs) {
> > > >       unset($alldataarr[$key][$subkey]);
> > > >     }
> > > >   }
> > > > }
> > > >
> > > > using foreach $arr as $key => $data you can get the
> > > key/index name as well as the actual value stored in that part of 
> > > your array.  Then all you have to do is refer back up to the main 
> > > array using the current $key/$subkey values as your indexes.
> > > >
> > >
> > > $filter = array(
> > > 	'Fruits'    => array('Apples' => 1, 'Oranges' => 1),
> > > 	'Furniture' => array('Couches' => 1, 'Chairs' => 1), );
> > >
> > > $alldataarr = array();
> > > $alldataarr["Fruits"] = array("Apples" => 3, "Oranges" => 5, 
> > > "Apricots" => 1); $alldataarr["Furniture"] = array("Couches"
> > > => 6, "Chairs" => 2, "Benches" => 5);
> > >
> > > foreach ($alldataarr as $key => $data) {
> > >     if (!isset($filter[$key]) {
> > > 	// we want it all;.
> > > 	continue;
> > >     }
> > >     $alldataarr[$key]= array_intersect_keys($data, 
> $filter[$key]); }
> > >
> > >
> > > // heres one I prepared earlier:
> > >
> > >
> > > /**
> > >   * array_intersect_keys()
> > >   *                    ^--- the internal function (php5.x+?)
> > > has no 's'
> > >   *
> > >   * returns the all the items in the 1st array whose keys 
> are found 
> > > in any of the other arrays
> > >   *
> > >   * @return array()
> > >   */
> > > function array_intersect_keys()
> > > {
> > >      $args           = func_get_args();
> > >      $originalArray  = $args[0];
> > >      $res            = array();
> > >
> > >      if(!is_array($originalArray)) { return $res; }
> > >
> > >      for($i=1;$i<count($args);$i++) {
> > >          if(!is_array($args[$i])) { continue; }
> > >          foreach ($args[$i] as $key => $data) {
> > >              if (isset($originalArray[$key]) && 
> !isset($res[$key])) {
> > >                  $res[$key] = $originalArray[$key];
> > >              }
> > >          }
> > >      }
> > >
> > >      return $res;
> > > }
> > >
> > >
> > >
> > >
> > > >
> > > > Basic example, but I think you can modify this to work with
> > > what you're doing.
> > > >
> > > > Let me know if you have any questions about this example.
> > > >
> > > > -TG
> > > >
> > > >
> > > >
> > > > = = = Original message = = =
> > > >
> > > > Hi all,
> > > >
> > > > I'm really struggling here! I have a large, multi-dimensional 
> > > > array that I want to "clean-up" a bit before committing 
> to a database.
> > > >
> > > > I want to remove quite a bit of the array but using the
> > > KEYs not the
> > > > values. I know the keys I want to keep and I know the keys
> > > I want to
> > > > get rid of. I want to keep the structure and sequence of
> > > the array in tact.
> > > >
> > > > All of the array traversing functions in PHP seem to
> > > either: only work
> > > > on the values, or do not allow the removal of elements 
> of the array!
> > > >
> > > > Can anyone offer a clue bat to a tired old array walker!
> > > >
> > > > Thanks
> > > >
> > > > Alan
> > > >
> > > >
> > > > ___________________________________________________________
> > > > Sent by ePrompter, the premier email notification software.
> > > > Free download at http://www.ePrompter.com.
> > > >
> > >
> > >
> >
> > --
> > PHP General Mailing List (http://www.php.net/) To 
> unsubscribe, visit: 
> > http://www.php.net/unsub.php
> >
> >
> 

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