Mapping на масив и обект

emagi

Registered
Скоро гледах някъде такава тема, та и мен ме интересува, какво бихте ме посъветвали в следния случай: имам следния масив:
PHP:
$baseArray  = array(
    "name" => "Moni",
    "family" => "Fischer",
    "age" => 25,
    "address" => array (
           "city" => "Sofiq",
           "street" => "Wrajdebna",
           "house_number" => 11
    ),
    "township" => array(
           "city" => "Varna",
           "street" => "Kaisiewa",
           "house_number" => 33
    )
);

И имам едни обкет, който има абсолютно същата структура:
PHP:
class Info {
           private $name;
           private $family;
           private $age;
           private $address;
           private $township;
           function __construct() {
                      $this->name = NULL;
                      $this->family = NULL;
                      $this->age = NULL;
                      $this->address = new Address();
                      $this->township = new Township();
           }

}
class Address {
           private $city;
           private $street;
           private $house_number;
           function __construct() {
                      $this->city = NULL;
                      $this->street = NULL;
                      $this->house_number = NULL;
           }
           public function getCity() {
                      return $this->city;
           }

           public function setCity($city) {
                      $this->city = $city;
           }

           public function getStreet() {
                      return $this->street;
           }

           public function setStreet($street) {
                      $this->street = $street;
           }

           public function getHouse_number() {
                      return $this->house_number;
           }

           public function setHouse_number($house_number) {
                      $this->house_number = $house_number;
           }



}
class Township {
           private $city;
           private $street;
           private $house_number;
           function __construct() {
                      $this->city = NULL;
                      $this->street = NULL;
                      $this->house_number = NULL;
           }
           public function getCity() {
                      return $this->city;
           }

           public function setCity($city) {
                      $this->city = $city;
           }

           public function getStreet() {
                      return $this->street;
           }

           public function setStreet($street) {
                      $this->street = $street;
           }

           public function getHouse_number() {
                      return $this->house_number;
           }

           public function setHouse_number($house_number) {
                      $this->house_number = $house_number;
           }
}

Нищо особено, НО проблема е, как мога да задам(прехвърля) стойностите на масива, като стойности на съответните свойства, със същите имена! С рефлекшън си вземам името на property-то, и итерирам масива, но имам два пъти city, и как точно да задам, че един път city при address е едно, а city при township е друго!
 
Ето и решението, ако на някого му е нужно:
PHP:
function mapObjectToArray($object, $array){
           $reflection = new ReflectionClass($object);
            foreach($reflection->getProperties() as $property){
                       $getter = "get".ucfirst($property->getName());
                       if(is_object(call_user_func(array($object, $getter)))){
                                  mapObjectToArray(call_user_func(array($object, $getter)), $array[$property->getName()]);
                       } else {
                                  $setter = "set".ucfirst($property->getName());
                                  if(array_key_exists($property->getName(), $array)){
                                             call_user_func(array($object, $setter), $array[$property->getName()]);
                                  }
                       }
            }
 }
 

Back
Горе