<?php
// vim:ts=3:sw=3:sts=3:ft=php:
class PleaseMap {
static function Array2Array (&$destination_array,$mapper,$source_array='_POST') {
if (is_string($source_array) ) {
// if the source_array is unspecified or a string, we assume it is
// a global array,like _POST or _GET or such, otherwise it is an array that
// the caller has passed to us explicitly
global ${$source_array};
$source_array = &${$source_array};
}
// loop through specification array grabbing the proper source array variables
// placing them in the destination
foreach ($mapper as $dest=>$src ) {
echo("Mapping $dest and $src\n");
$destination_array[$dest] = $source_array[$src];
}
return @$destination_array;
}
static function Object2Array (&$destination_array,$mapper=null, $source_class) {
if (!$mapper) $mapper = 'pleaseMap';
if (is_string($mapper) ) {
// if the source specification map is not explicitly passed
// to us, look for a 'pleaseMap' array in the source class
//
// if the source specification map IS explicitly passed
// as a string, we take it as an alternat map name in the source class
//
// The source class will usually be the caller's class
$mapper = &$source_class->$mapper;
} // otherwise mapper is an array map passed to us
// loop through the mapper array grabbing the proper source class variables
// placing them in the destination
// either by setting the value directly or calling the correct 'set' method
foreach ($mapper as $dest=>$srcloc ) {
// is there a getvalue method in the source?
if (method_exists($source_class,$srcloc)) {
$val = $source_class->$srcloc();
} else $val = $source_class->$srcloc;
$destination_array[$dest]= $val;
}
return @$destination_array;
}
static function Object2Object (&$destination_class,$mapper=null, $source_class) {
if (!$mapper) $mapper = 'pleaseMap';
if (is_string($mapper) ) {
// if the source specification map is not explicitly passed
// to us, look for a 'pleaseMap' array in the destination class
//
// if the source specification map IS explicitly passed
// as a string, we take it as an alternat map name in the destination class
//
// The destination class will usually be the caller's class
$mapper = &$destination_class->$mapper;
} // otherwise mapper is an array map passed to us
// loop through the mapper array grabbing the proper source class variables
// placing them in the destination
// either by setting the value directly or calling the correct 'set' method
foreach ($mapper as $destloc=>$srcvar ) {
// is there a getvalue method in the source to get the srcvar?
if (method_exists($source_class,$srcvar)) {
$val = $source_class->$srcvar( $destloc);
} else $val = $source_class->$srcvar;
if (method_exists($destination_class,$destloc)) {
$destination_class->$destloc( $val,$key);
} else $destination_class->$destloc = $val;
}
return @$destination_class;
}
static function Array2Object (&$destination_class,$mapper=null, $source_array='_POST') {
if (!$mapper) $mapper = 'pleaseMap';
if (!$source_array) $source_array = '_POST';
if (is_string($source_array) ) {
// if the source_array is unspecified or a string, we assume it is
// a global array,like _POST or _GET or such, otherwise it is an array that
// the caller has passed to us explicitly
global ${$source_array};
$source_array = &${$source_array};
}
if (is_string($mapper) ) {
// if the source specification map is not explicitly passed
// to us, look for a 'pleaseMap' array in the destination class
//
// if the source specification map IS explicitly passed
// as a string, we take it as an alternat map name in the destination class
//
// The destination class will usually be the caller's class
$mapper = &$destination_class->$mapper;
// and place them in the destination
} //otherwise the mapper is an array passed by the caller
// if the source specification map is passed explicitly as an array, we
// loop through the map grabbing the proper source array variables
// placing them in the destination
// either by setting the value directly or calling the correct 'set' method
foreach ($mapper as $dest=>$var ) {
if (method_exists($destination_class,$dest)) {
$destination_class->$dest( $source_array[$var],$var);
} else $destination_class->$dest = $source_array[$var];
}
return @$destination_class;
}
}
if (false) { //set true for test
class test {
var $myName;
// always remember array keys are destination variable names, values are the source field names
var $pleaseMap = array ('var1' => 'var4', 'var2' => 'nonAvalue' , 'var3'=>'var5' );
var $otherMap = array ('setmyvalue' => 'grabValue', 'var4' => 'grabValue' , 'var5'=>'var1' );
var $var1="bob";
var $var2="sam";
var $var3="hal";
var $var4="ellen";
var $var5="candice";
var $myvalue = 5;
function setmyvalue ($v) {
$this->myvalue=$v;
}
function grabvalue() {
return "value from method";
}
function show($name) {
$v = $this -> $name;
echo (" class " . $this->myName . " variable $name is $v\n" );
return $v;
}
function debug () {
$debugMap = array ('var1' => 'show', 'var2' => 'show', 'var3' => 'show', 'var4' => 'show', 'var5' =>'show', 'myvalue'=> 'show');
// this prints all my variables
pleaseMap::Object2Object($this,$debugMap,$this);
}
function clearAll() {
$this->var1 = "------";
$this->var2 = "------";
$this->var3 = "------";
$this->var4 = "------";
$this->var5 = "------";
$this->myvalue = "------";
}
}
$c1= new test;
$c2= new test;
$c1 -> myName = "destination";
$c2 -> myName = "source";
$c2->debug();
$c1->clearAll();
echo("Object to Object test:");
echo("\nNow mapping source using default 'pleaseMap' specification arrray\n");
echo("the map of destination class elements from source values for array ('var1' => 'var4', 'var2' => 'nonAvalue' , 'var3'=>'var5' )");
echo("\n expected results ellen in var1, empty in var2, and candice in var3\n");
pleaseMap::Object2Object($c1,null,$c2);
$c1->debug();
$c1->clearAll();
echo("\nNow mapping source using 'otherMap' specification arrray\n");
echo ("the map of destination class elements from source values for array ('setmyvalue' => 'grabValue', 'var4' => 'grabValue' , 'var5'=>'var1' )");
echo("\n expected results 'value from method' in myvalue, 'value from method in var4, and bob in var5\n");
pleaseMap::Object2Object($c1,'otherMap',$c2);
$c1->debug();
$c1->clearAll();
echo("\n\nArray to Object test:");
echo("\nNow mapping source using 'otherMap' specification arrray from an array rather than a class\n");
echo("\n expected results 'just a constant' in myvalue, 'just a constant' in var4, and 1000 in var5\n");
pleaseMap::Array2Object($c1,'otherMap',array('grabValue'=> 'just a constant', 'var1' =>1000));
$c1->debug();
echo("\n\nObject to Array test:");
$destArray=array('key1'=>'some value', 'var4' => 'previous value');
$c2->debug();
print_r($destArray);
echo("\nNow mapping source using 'otherMap' specification arrray from an array rather than a class\n");
echo ("the map of destination array elements from source values for array ('setmyvalue' => 'grabValue', 'var4' => 'grabValue' , 'var5'=>'var1' )");
echo("\n expected results 'value from method' in setmyvalue, 'value from method' in var4, and bob in var5, while preserving 'key1' as 'some value'\n");
$destArray=pleaseMap::Object2Array($destArray,$c2->otherMap, $c2);
print_r($destArray);
echo("\n\nArray to Array test:");
$destArray=array('key1'=>'some value', 'var4' => 'previous value');
echo("\nNow mapping source using 'otherMap' specification arrray from an array rather than a class\n");
echo ("the map of destination class elements from source values for array ('myvalue'=>'thiskey', 'var4' => 'var4' )");
echo("\n expected results NULL in myvalue, 'source value' in var4, while preserving 'key1' as 'some value'\n");
$destArray=array('key1'=>'some value', 'var4' => 'previous value');
$srcArray=array('key1'=>'some value', 'var4' => 'source value','thiskey'=>'will be ignored');
$destArray=pleaseMap::Array2Array($destArray,array('myvalue'=>'nonexisting', 'var4'=>'var4'), $srcArray);
print_r($destArray);
}
?>
|