data = $data; if (!$type) { $type = $this->calculateType(); } $this->type = $type; if ($type === 'struct') { // Turn all the values in the array in to new IXR_Value objects foreach ($this->data as $key => $value) { $this->data[$key] = new Value($value); } } if ($type === 'array') { for ($i = 0, $j = count($this->data); $i < $j; $i++) { $this->data[$i] = new Value($this->data[$i]); } } } public function calculateType() { if ($this->data === true || $this->data === false) { return 'boolean'; } if (is_integer($this->data)) { return 'int'; } if (is_double($this->data)) { return 'double'; } // Deal with IXR object types base64 and date if (is_object($this->data) && $this->data instanceof Date) { return 'date'; } if (is_object($this->data) && $this->data instanceof Base64) { return 'base64'; } // If it is a normal PHP object convert it in to a struct if (is_object($this->data)) { $this->data = get_object_vars($this->data); return 'struct'; } if (!is_array($this->data)) { return 'string'; } // We have an array - is it an array or a struct? if ($this->isStruct($this->data)) { return 'struct'; } else { return 'array'; } } public function getXml() { // Return XML for this value switch ($this->type) { case 'boolean': return '' . (((bool)$this->data) ? '1' : '0') . ''; case 'int': return '' . $this->data . ''; case 'double': return '' . $this->data . ''; case 'string': return '' . htmlspecialchars($this->data) . ''; case 'array': $return = '' . "\n"; foreach ($this->data as $item) { $return .= ' ' . $item->getXml() . "\n"; } $return .= ''; return $return; break; case 'struct': $return = '' . "\n"; foreach ($this->data as $name => $value) { $name = htmlspecialchars($name); $return .= " $name"; $return .= $value->getXml() . "\n"; } $return .= ''; return $return; case 'date': case 'base64': return $this->data->getXml(); default: return false; } } /** * Checks whether or not the supplied array is a struct or not * * @param array $array * @return boolean */ public function isStruct($array) { $expected = 0; foreach ($array as $key => $value) { if ((string)$key != (string)$expected) { return true; } $expected++; } return false; } }