/** * Makes sure the given array is a valid API response fragment * @param array $arr */ protected function sanitizeArrayForAPI(&$arr) { if (!is_array($arr)) { return; } $counter = 1; foreach ($arr as $key => &$value) { $sanitizedKey = $this->sanitizeKeyForAPI($key); if ($sanitizedKey !== $key) { if (isset($arr[$sanitizedKey])) { // Make the sanitized keys hopefully unique. // To make it definitely unique would be too much effort, given that // sanitizing is only needed for misformatted metadata anyway, but // this at least covers the case when $arr is numeric. $sanitizedKey .= $counter; ++$counter; } $arr[$sanitizedKey] = $arr[$key]; unset($arr[$key]); } if (is_array($value)) { $this->sanitizeArrayForAPI($value); } } // Handle API metadata keys (particularly "_type") $keys = array_filter(array_keys($arr), 'ApiResult::isMetadataKey'); if ($keys) { ApiResult::setPreserveKeysList($arr, $keys); } }
/** * @covers ApiResult */ public function testMetadata() { $arr = array('foo' => array('bar' => array())); $result = new ApiResult(8388608); $result->addValue(null, 'foo', array('bar' => array())); $expect = array('foo' => array('bar' => array(ApiResult::META_INDEXED_TAG_NAME => 'ritn', ApiResult::META_TYPE => 'default'), ApiResult::META_INDEXED_TAG_NAME => 'ritn', ApiResult::META_TYPE => 'default'), ApiResult::META_SUBELEMENTS => array('foo', 'bar'), ApiResult::META_INDEXED_TAG_NAME => 'itn', ApiResult::META_PRESERVE_KEYS => array('foo', 'bar'), ApiResult::META_TYPE => 'array'); ApiResult::setSubelementsList($arr, 'foo'); ApiResult::setSubelementsList($arr, array('bar', 'baz')); ApiResult::unsetSubelementsList($arr, 'baz'); ApiResult::setIndexedTagNameRecursive($arr, 'ritn'); ApiResult::setIndexedTagName($arr, 'itn'); ApiResult::setPreserveKeysList($arr, 'foo'); ApiResult::setPreserveKeysList($arr, array('bar', 'baz')); ApiResult::unsetPreserveKeysList($arr, 'baz'); ApiResult::setArrayTypeRecursive($arr, 'default'); ApiResult::setArrayType($arr, 'array'); $this->assertSame($expect, $arr); $result->addSubelementsList(null, 'foo'); $result->addSubelementsList(null, array('bar', 'baz')); $result->removeSubelementsList(null, 'baz'); $result->addIndexedTagNameRecursive(null, 'ritn'); $result->addIndexedTagName(null, 'itn'); $result->addPreserveKeysList(null, 'foo'); $result->addPreserveKeysList(null, array('bar', 'baz')); $result->removePreserveKeysList(null, 'baz'); $result->addArrayTypeRecursive(null, 'default'); $result->addArrayType(null, 'array'); $this->assertEquals($expect, $result->getResultData()); $arr = array('foo' => array('bar' => array())); $expect = array('foo' => array('bar' => array(ApiResult::META_TYPE => 'kvp', ApiResult::META_KVP_KEY_NAME => 'key'), ApiResult::META_TYPE => 'kvp', ApiResult::META_KVP_KEY_NAME => 'key'), ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'bc'); ApiResult::setArrayTypeRecursive($arr, 'kvp', 'key'); ApiResult::setArrayType($arr, 'BCkvp', 'bc'); $this->assertSame($expect, $arr); }