<?php /*  PHP_functions.php  written by and Copyright © 2009,2010 Joe Golembieski, SoftMoon WebWare 
 
        This program is free software: you can redistribute it and/or modify 
        it under the terms of the GNU General Public License as published by 
        the Free Software Foundation, either version 3 of the License, or 
        (at your option) any later version. 
 
        This program is distributed in the hope that it will be useful, 
        but WITHOUT ANY WARRANTY; without even the implied warranty of 
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
        GNU General Public License for more details. 
 
        You should have received a copy of the GNU General Public License 
        along with this program.  If not, see <http://www.gnu.org/licenses/>   */ 
 
 
Function preg_key_grep($A, $preg, $KeepKey=FALSE)  { $subA=array(); 
    $keys=preg_grep($preg, array_keys($A)); 
    if ($KeepKey) 
        foreach ($keys as $k)  {$subA[$k]=$A[$k];} 
    else 
        foreach ($keys as $k)  {$subA[]=$A[$k];} 
    return $subA;  } 
 
Function is_iterateable($var) { 
    return (is_array($var)  or  is_object($var) /*PHP>=5.3*/ and  !is_callable($var) /**/ );  } 
 
Define("KEEP_TREE", 1); 
Define("KEEP_KEY", 2); 
                                //   ¤5•3 
Function array_subkey($A, $indxLevel, $IDkey, $KeepTree=FALSE)  {  $KeepKey=($KeepTree & KEEP_KEY); 
    if ($indxLevel<2)  { 
        if (is_array($IDkey)  and  is_array($IDkey['filter']))  $IDkey=array_shift($IDkey['filter']); 
        if ($IDkey===NULL)  return $A; 
//    if (is_callable($IDkey))  {  // non-object-oriented-PHP  [DANGER!  string-keyname / function-name collision] 
        if ( is_object($IDkey) 
        and  /* $flag=method_exists($IDkey, 'filter')   PHP < 5.3 
        or */  is_callable($IDkey)     /* PHP >= 5.3   [PREFERRED] */   )  { 
            $indx=$KeepTree;  $x=($flag) ? $IDkey->filter($A, $indx) : $IDkey($A, $indx); 
            return ($KeepKey  and  $x!==NULL  and  $indx!==NULL) ? array($indx => $x) : $x;  } 
        else 
        if (is_array($IDkey))  { $subA=array(); 
            if (is_array($IDkey['re-index']))  {$IDkey=$IDkey['re-index'];  $reindex=TRUE;}  //while only useful with "keep key", we process this here to allow the same filter to be used with and without the "keep key" option. Move it down one line for faster performance and strickter implementation. 
            if ($KeepKey) 
                foreach ($IDkey as $newindex => $key)  { 
//          if (is_callable($IDkey))  {  // non-object-oriented-PHP   [DANGER!  string-keyname / function-name collision] 
                    if (is_object($key) 
                    and  /* PHP < 5.3   $flag=method_exists($key, 'filter')  */ 
                    /*or   PHP>=5.3 */ is_callable($key) )  { $indx=$KeepTree; 
                        if (($x=($flag) ? $key->filter($A, $indx) : $key($A, $indx))!==NULL)  $subA[$indx]=$x;  continue;  } 
                    if (substr($key, 0, 1)=="/")   {$subA=$subA+preg_key_grep($A, $key, KEEP_KEY);  continue;} 
                    if (array_key_exists($key, $A))  $subA[($reindex) ? $newindex : $key]=$A[$key];  } 
            else 
                foreach ($IDkey as $key)  { 
//          if (is_callable($IDkey))  {  // non-object-oriented-PHP   [DANGER!  string-keyname / function-name collision] 
                    if (is_object($key) 
                    and  /* PHP < 5.3   $flag=method_exists($key, 'filter')  */ 
                    /*or   PHP>=5.3 */ is_callable($key) )  { 
                        if (($x=($flag) ? $key->filter($A) : $key($A))!==NULL)  $subA[]=$x;  continue;  } 
                    if (substr($key, 0, 1)=="/")   {$subA=array_merge($subA, preg_key_grep($A, $key));  continue;} 
                    if (array_key_exists($key, $A))  $subA[]=$A[$key];  }  } 
        else 
        if (substr($IDkey, 0, 1)=="/")  {$subA=preg_key_grep($A, $IDkey, $KeepKey);} 
        else  return ($KeepKey  and  isset($A[$IDkey])) ? array($IDkey => $A[$IDkey]) : $A[$IDkey];  } 
    else  { 
        if (is_array($IDkey)  and  is_array($IDkey['filter'])  and  ($filter=array_shift($IDkey['filter']))!==NULL)  { 
            $x=array_subkey($A, 1, $filter, $KeepKey); 
            if (is_array($filter)  or  @substr($filter, 0, 1)=="/"  or  $KeepKey)  { 
                $indxLevel++;  array_unshift($IDkey['filter'], NULL);  } 
            if (is_iterateable($x)  and  $t=array_subkey($x, $indxLevel-1, $IDkey, $KeepTree))  $subA=$t;  } 
        else  { $subA=array(); 
        if ($KeepTree)  { 
            if ($KeepKey) 
                foreach ($A as $indx => $data)  { 
                    if (is_iterateable($data)  and  NULL!==($t=array_subkey($data, $indxLevel-1, $IDkey, $KeepTree)))  $subA[$indx]=$t;  } 
            else 
                foreach ($A as $data)  { 
                    if (is_iterateable($data)  and  NULL!==($t=array_subkey($data, $indxLevel-1, $IDkey, $KeepTree)))  $subA[]=$t;  }  } 
        else 
                foreach ($A as $data)  { 
                    if (is_iterateable($data)  and  NULL!==($t=array_subkey($data, $indxLevel-1, $IDkey)))  { 
                        if (is_array($t)) $subA=array_merge($subA, $t);  else  $subA[]=$t;  }  }  }  } 
    return ($subA  and  count($subA)) ? $subA : NULL;  } 
?>
 
 |