3v4l.org

run code in 150+ php & hhvm versions
Bugs & Features
<?php /** * @xmlNamespace http://www.webservices.nl/soap/ * @xmlType * @xmlName RiskAddress */ class Address { /** * @xmlType string * @xmlRender value * @xmlName postcode * @xmlNamespace http://www.webservices.nl/soap/ */ protected $_postcode; /** * @xmlType string * @xmlRender value * @xmlName building * @xmlNamespace http://www.webservices.nl/soap/ */ protected $_building; /** * @xmlType string * @xmlRender value * @xmlName street * @xmlNamespace http://www.webservices.nl/soap/ */ protected $_street; /** * @xmlType integer * @xmlRender value * @xmlName house_number * @xmlNamespace http://www.webservices.nl/soap/ */ protected $_house_number; /** * @xmlType string * @xmlRender value * @xmlName house_number_addition * @xmlNamespace http://www.webservices.nl/soap/ */ protected $_house_number_addition; /** * @xmlType string * @xmlRender value * @xmlName city * @xmlNamespace http://www.webservices.nl/soap/ */ protected $_city; /** * @xmlType string * @xmlRender value * @xmlName municipality * @xmlNamespace http://www.webservices.nl/soap/ */ protected $_municipality; /** * @xmlType string * @xmlRender value * @xmlName state * @xmlNamespace http://www.webservices.nl/soap/ */ protected $_state; /** * @xmlType string * @xmlRender value * @xmlName country * @xmlNamespace http://www.webservices.nl/soap/ */ protected $_country; /** * @return string */ public function getPostcode() { return $this->_postcode; } /** * @param string $postcode */ public function setPostcode($postcode) { $this->_postcode = (string) $postcode; } /** * @return string */ public function getBuilding() { return $this->_building; } /** * @param string $building */ public function setBuilding($building) { $this->_building = (string) $building; } /** * @return string */ public function getStreet() { return $this->_street; } /** * @param string $street */ public function setStreet($street) { $this->_street = (string) $street; } /** * @return integer */ public function getHouseNumber() { return $this->_house_number; } /** * @param (integer) $houseNumber */ public function setHouseNumber($houseNumber) { $this->_house_number = (integer) $houseNumber; } /** * @return string */ public function getHouseNumberAddition() { return $this->_house_number_addition; } /** * @param string $houseNumberAddition */ public function setHouseNumberAddition($houseNumberAddition) { $this->_house_number_addition = (string) $houseNumberAddition; } /** * @return string */ public function getCity() { return $this->_city; } /** * @param string $city */ public function setCity($city) { $this->_city = (string) $city; } /** * @return string */ public function getMunicipality() { return $this->_municipality; } /** * @param string $municipality */ public function setMunicipality($municipality) { $this->_municipality = $municipality; } /** * @return string */ public function getState() { return $this->_state; } /** * @param string $state */ public function setState($state) { $this->_state = (string) $state; } /** * @return string */ public function getCountry() { return $this->_country; } /** * @param string $country */ public function setCountry($country) { $this->_country = (string) $country; } } class AddressHelper { public static function parse(Address $address, $parts) { $parts = func_get_args(); $address = array_shift($parts); $format = '~^(.*?\n)??' . '(?<street>[^0-9].*|.*?[^0-9])[\b\s]*?' . '(?<number>[0-9]{1,5}?)[\b\s\-]*?' . '(?<addition>[^\s]*?)[\b\s,]*?' . '(?<postcode>[0-9]{4}\s?[A-Z]{2})[\b\s,]*?' . '(?<city>[\w][\w\s]*?)' . '(\n.*)??$~msiU'; if (preg_match($format, implode(PHP_EOL, $parts), $args)) { $street = $number = $postcode = $city = $addition = null; extract($args, EXTR_OVERWRITE); $address->setStreet($street); $address->setHouseNumber($number); $address->setHouseNumberAddition($addition); $address->setPostcode($postcode); $address->setCity(strtoupper(trim($city))); } return $address; } } class Marshaller { protected $_includeNilValues = true; public function __construct($includeNilValues = true) { $this->_includeNilValues = $includeNilValues; } public function marshall($object) { return $this->_marshallObject($object); } protected function _marshallObject($object) { $output = array(); $refClass = new ReflectionClass($object); foreach ($refClass->getProperties(ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PUBLIC) as $refProp) { $propValue = $object->{$this->_getPropertyAccessor($refProp->getName())}(); $this->_marshallProperty($refProp->getName(), $propValue, $output); } return $output; } protected function _marshallProperty($propName, &$propValue, array &$output) { if (($propValue === null || $propValue === '') && $this->_includeNilValues === false) return; if (is_object($propValue)) { $this->_assignArrayValue($output, $this->_getPropertyArrayKey($propName), $this->_marshallObject($propValue)); } elseif (is_array($propValue)) { $arrayOutput = array(); foreach ($propValue as $nestedPropVal) { $array = array(); $this->_marshallProperty($this->_getPropertyArrayKey($propName), $nestedPropVal, $array); $arrayOutput = array_merge_recursive($arrayOutput, array(array_shift($array))); } if ('' !== implode('', $arrayOutput)) $output[$this->_getPropertyArrayKey($propName)] = $arrayOutput; } else { $this->_assignArrayValue($output, $this->_getPropertyArrayKey($propName), $propValue); } } protected function _assignArrayValue(array &$output, $key, $value) { // remove empty arrays when include nilvalues is set to true if (false === $this->_includeNilValues && is_array($value) && empty($value) && '' == implode('', $value)) { return; } if (false === $this->_includeNilValues && (is_null($value) || $value === '')) { return; } $output[$key] = $value; } /** * Convert a class property name to an array key * @param string $propName * @return string */ protected function _getPropertyArrayKey($propName) { return ltrim($propName, '_'); } /** * Get the accessor for a class property name * @param string $propName * @return string */ protected function _getPropertyAccessor($propName) { $propName = ltrim($propName, '_'); $propParts = explode('_', $propName); foreach ($propParts as &$propPart) { $propPart = ucfirst($propPart); } return 'get' . implode('', $propParts); } public function includeNilValues() { $this->_includeNilValues = true; } public function excludeNilValues() { $this->_includeNilValues = false; } } //$parsedAddress = AddressHelper::parse(new Address(), null, null, null, null, null)); $address = new Address(); $address->setStreet('abcedf'); $marshaller = new Marshaller(false); $marshaller->marshall($address); $marshaller->marshall($address); var_dump($marshaller->marshall($address));
Output for 5.3.0 - 7.1.0
array(1) { ["street"]=> string(6) "abcedf" }