/**
  * 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);
     }
 }
Beispiel #2
0
 /**
  * @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);
 }