<?php
if (interface_exists('JsonSerializable', true) === false) {
interface JsonSerializable {
/**
* (PHP 5 >= 5.4.0)<br/>
* Specify data which should be serialized to JSON
* @link http://php.net/manual/en/jsonserializable.jsonserialize.php
* @return mixed data which can be serialized by <b>json_encode</b>,
* which is a value of any type other than a resource.
*/
function jsonSerialize ();
}
}
/**
* @package MXO_JSON
*/
abstract class MXO_JSON_Collection implements Countable, ArrayAccess, IteratorAggregate, JsonSerializable {
protected $container = array();
public function __construct(array $init_array = array()) {
$this->container = $init_array;
}
public function count() {
return count($this->container);
}
public function offsetExists($offset) {
return isset($this->container[$offset]);
}
public function offsetGet($offset) {
return isset($this->container[$offset]) === true ? $this->container[$offset] : null;
}
public function getIterator() {
return new ArrayIterator($this->container);
}
public function __clone() {
$this->container = MXO_JSON::copy($this->container);
}
/**
* returns result in raw format - for use with php's array functions
*
* @deprecated If you need this, consider adding more array-specific functions to MXO_JSON_Utils
*/
public function getRaw() {
$result = array();
foreach ($this->container as $key => $element) {
if ($element instanceof MXO_JSON_Collection) {
$result[$key] = $element->getRaw();
} else {
$result[$key] = $element;
}
}
return $result;
}
/**
* Like getRaw, but only converts this collection to an array;
* deeper collections are left as-is.
*
* @deprecated If you need this, consider adding more array-specific functions to MXO_JSON_Utils
*/
public function getAsArray() {
return $this->container;
}
public function keyExists($key) {
return array_key_exists($key, $this->container);
}
public function keys() {
return array_keys($this->container);
}
public function values() {
return array_values($this->container);
}
public function sort($sort_flags = null) {
return sort($this->container, $sort_flags);
}
public function rsort($sort_flags = null) {
return rsort($this->container, $sort_flags);
}
abstract public function natsort();
abstract public function natcasesort();
public function usort($value_compare_func) {
return usort($this->container, $value_compare_func);
}
abstract public function map($callback);
abstract public function filter($callback);
abstract public function merge($obj);
public function search($needle) {
return array_search($needle, $this->container, true);
}
abstract public function intersect($obj);
}