/** * Determines the total depth of a multi-dimensional array or object. * Has two methods of determining depth: based on recursive depth, or based on tab indentation (faster). * * @uses Titon\Utility\Converter * * @param array|object $set * @return int * @throws \Titon\Utility\Exception\InvalidTypeException */ public static function depth($set) { if (is_object($set)) { $set = Converter::toArray($set); } else { if (!is_array($set)) { throw new InvalidTypeException('Value passed must be an array'); } } if (!$set) { return 0; } $depth = 1; foreach ($set as $value) { if (is_array($value)) { $count = static::depth($value) + 1; if ($count > $depth) { $depth = $count; } } } return $depth; }
/** * Processes the feed and rebuilds an array based on the feeds type (RSS, RDF, Atom). * * @param HttpSocketResponse $response * @param array $query * @param string $source * @return bool */ protected function _process(HttpSocketResponse $response, $query, $source) { if (!$response->isOk()) { return array(); } $feed = Converter::toArray($response->body()); $clean = array(); if (!empty($query['root']) && !empty($feed[$query['feed']['root']])) { $items = $feed[$query['feed']['root']]; } else { // RSS if (isset($feed['channel']) && isset($feed['channel']['item'])) { $items = $feed['channel']['item']; // RDF } else { if (isset($feed['item'])) { $items = $feed['item']; // Atom } else { if (isset($feed['entry'])) { $items = $feed['entry']; // XML } else { $items = $feed; } } } } if (empty($items) || !is_array($items)) { return $clean; } // Gather elements $elements = array('title' => array('title'), 'guid' => array('guid', 'id'), 'date' => array('date', 'pubDate', 'published', 'updated'), 'link' => array('link', 'origLink'), 'image' => array('image', 'thumbnail', 'enclosure'), 'author' => array('author', 'writer', 'editor', 'user'), 'source' => array('source'), 'description' => array('description', 'desc', 'summary', 'content', 'text')); if (is_array($query['fields'])) { $elements = array_merge_recursive($elements, $query['fields']); } // Loop the feed foreach ($items as $item) { $data = array(); foreach ($elements as $element => $keys) { if (isset($keys['attributes'])) { $attributes = $keys['attributes']; unset($keys['attributes']); } else { $attributes = array('value', 'href', 'src', 'name', 'label', 'url'); } if (isset($keys['keys'])) { $keys = $keys['keys']; } foreach ($keys as $key) { if (isset($item[$key]) && empty($data[$element])) { if ($value = $this->_extract($item[$key], $attributes)) { $data[$element] = $value; break; } } } } if (empty($data['link'])) { trigger_error(sprintf('Feed %s does not have a valid link element', $source), E_USER_NOTICE); continue; } if (empty($data['source']) && $source) { $data['source'] = (string) $source; } // Determine how to sort $sortBy = $query['feed']['sort']; if (isset($data[$sortBy])) { $sort = $data[$sortBy]; } else { if (isset($data['date'])) { $sort = $data['date']; } else { $sort = null; } } if ($sortBy === 'date' && $sort) { $sort = strtotime($sort); } else { if (!$sort) { $sort = microtime(); } } if ($data) { $clean[$sort] = $data; } } return $clean; }
function to_array($data) { return Converter::toArray($data); }
/** * Test that buildArray() and buildObject() convert all nested tiers. */ public function testBuildArrayObject() { $array = array('one' => 1); $object = new \stdClass(); $object->one = 1; $this->assertEquals($array, Converter::toArray($object)); $this->assertEquals($object, Converter::toObject($array)); $array['one'] = array('two' => 2); $level = new \stdClass(); $level->two = 2; $object->one = $level; $this->assertEquals($array, Converter::toArray($object)); $this->assertEquals($object, Converter::toObject($array)); $array['one']['two'] = array('three' => 3); $level = new \stdClass(); $level->three = 3; $object->one->two = $level; $this->assertEquals($array, Converter::toArray($object)); $this->assertEquals($object, Converter::toObject($array)); }