first()` and `$result->indexBy($field)`. */ class Result extends \ArrayObject implements \JsonSerializable { /** * @var string */ public $entity; /** * @var string */ public $action; /** * @var array */ public $debug; /** * Api version * @var int */ public $version = 4; private $indexedBy; /** * Return first result. * @return array|null */ public function first() { foreach ($this as $values) { return $values; } return NULL; } /** * Return last result. * @return array|null */ public function last() { $items = $this->getArrayCopy(); return array_pop($items); } /** * @param int $index * @return array|null */ public function itemAt($index) { $length = $index < 0 ? 0 - $index : $index + 1; if ($length > count($this)) { return NULL; } return array_slice(array_values($this->getArrayCopy()), $index, 1)[0]; } /** * Re-index the results array (which by default is non-associative) * * Drops any item from the results that does not contain the specified key * * @param string $key * @return $this * @throws \API_Exception */ public function indexBy($key) { $this->indexedBy = $key; if (count($this)) { $newResults = []; foreach ($this as $values) { if (isset($values[$key])) { $newResults[$values[$key]] = $values; } } if (!$newResults) { throw new \API_Exception("Key $key not found in api results"); } $this->exchangeArray($newResults); } return $this; } /** * Returns the number of results * * @return int */ public function count() { $count = parent::count(); if ($count == 1 && is_array($this->first()) && array_keys($this->first()) == ['row_count']) { return $this->first()['row_count']; } return $count; } /** * Reduce each result to one field * * @param $name * @return array */ public function column($name) { return array_column($this->getArrayCopy(), $name, $this->indexedBy); } /** * @return array */ public function jsonSerialize() { return $this->getArrayCopy(); } }