- <?php 
-   
- /** 
-  * Função que testa se o array é sequencial. 
-  *  
-  * @param array Array a ser testado 
-  * @return bool True se $array for sequencial, False caso contrário 
-  */ 
-   
- function-  is_sequential  (array $array) {
 
-     return array_filter($array, "is_int",-  ARRAY_FILTER_USE_KEY ) == true;
 
- } 
-   
- /** 
-  * Função que testa se o array é associativo. 
-  *  
-  * @param array Array a ser testado 
-  * @return bool True se $array for associativo, False caso contrário 
-  */ 
-   
- function-  is_associative  (array $array) {
 
-     return array_filter($array, "is_string",-  ARRAY_FILTER_USE_KEY ) == true;
 
- } 
-   
-   
- /** 
-  * Lista de testes que a função deve ser submetida. 
-  *  
-  * Cada item da lista deve ser um array com três índices. 
-  * O primeiro, "array", com o array a ser testado pela função. 
-  * O segundo, "is_sequential", um valor booleano esperado como retorno da função is_sequential. 
-  * O terceiro, "is_associative", um valor booleano esperado como retorno da função is_associative. 
-  */ 
-   
-   
- // Teste 1: Array com índices numéricos sequenciais 
-   
- $tests[] = [ 
-     "array" => ["a", "b", "c", "d", "e"],  
-     "is_sequential" => true, 
-     "is_associative" => false 
- ]; 
-   
- // Teste 2: Array associativo 
-   
- $tests[] = [ 
-     "array" => ["name" => "foo", "lastname" => "bar"],  
-     "is_sequential" => false, 
-     "is_associative" => true 
- ]; 
-   
- // Teste 3: Array com chave do tipo string contendo inteiro válido 
-   
- $tests[] = [ 
-     "array" => ["0" => "foo", "1" => "bar"],  
-     "is_sequential" => true, 
-     "is_associative" => false 
- ]; 
-   
- // Teste 4: Array com índices do tipo float 
-   
- $tests[] = [ 
-     "array" => [0.5 => "foo", -3.5 => "bar"],  
-     "is_sequential" => true, 
-     "is_associative" => false 
- ]; 
-   
- // Teste 5: Array com índices do tipo booleanos 
-   
- $tests[] = [ 
-     "array" => [true => "foo", false => "bar"],  
-     "is_sequential" => true, 
-     "is_associative" => false 
- ]; 
-   
- // Teste 6: Array com índice nulo 
-   
- $tests[] = [ 
-     "array" => [null => "foo"],  
-     "is_sequential" => false, 
-     "is_associative" => true 
- ]; 
-   
- // Teste 7: Array misto 
-   
- $tests[] = [ 
-     "array" => ["foo", "baz" => "bar"],  
-     "is_sequential" => true, 
-     "is_associative" => true 
- ]; 
-   
- // Teste 8: Array de índices numéricos desordenados 
-   
- $tests[] = [ 
-     "array" => [1 => "foo", 0 => "bar"],  
-     "is_sequential" => true, 
-     "is_associative" => false 
- ]; 
-   
- // Teste 9: Array de índices numéricos ordenados não sequenciais 
-   
- $tests[] = [ 
-     "array" => [0 => "foo", 1 => "bar", 6 => "baz"],  
-     "is_sequential" => true, 
-     "is_associative" => false 
- ]; 
-   
-   
- /** 
-  * Executa os testes. 
-  */ 
-   
- try { 
-     foreach ($tests as $i => $test) { 
-         if ($test["is_sequential"] !== is_sequential($test["array"])) { 
-             throw new-  Exception (sprintf("is_sequential: Algo errado não está certo! Teste %d falhou.", $i+1));
 
-         } 
-   
-         if ($test["is_associative"] !== is_associative($test["array"])) { 
-             throw new-  Exception (sprintf("is_associative: Algo errado não está certo! Teste %d falhou.", $i+1));
 
-         } 
-     } 
-   
-     echo "Parabéns! Sua função passou em todos os testes.", PHP_EOL; 
- } catch (Exception $e) { 
-     echo $e->getMessage(), PHP_EOL; 
- } 
-   
-   
				PD9waHAKCi8qKgogKiBGdW7Dp8OjbyBxdWUgdGVzdGEgc2UgbyBhcnJheSDDqSBzZXF1ZW5jaWFsLgogKiAKICogQHBhcmFtIGFycmF5IEFycmF5IGEgc2VyIHRlc3RhZG8KICogQHJldHVybiBib29sIFRydWUgc2UgJGFycmF5IGZvciBzZXF1ZW5jaWFsLCBGYWxzZSBjYXNvIGNvbnRyw6FyaW8KICovCgpmdW5jdGlvbiBpc19zZXF1ZW50aWFsIChhcnJheSAkYXJyYXkpIHsKICAgIHJldHVybiBhcnJheV9maWx0ZXIoJGFycmF5LCAiaXNfaW50IiwgQVJSQVlfRklMVEVSX1VTRV9LRVkpID09IHRydWU7Cn0KCi8qKgogKiBGdW7Dp8OjbyBxdWUgdGVzdGEgc2UgbyBhcnJheSDDqSBhc3NvY2lhdGl2by4KICogCiAqIEBwYXJhbSBhcnJheSBBcnJheSBhIHNlciB0ZXN0YWRvCiAqIEByZXR1cm4gYm9vbCBUcnVlIHNlICRhcnJheSBmb3IgYXNzb2NpYXRpdm8sIEZhbHNlIGNhc28gY29udHLDoXJpbwogKi8KCmZ1bmN0aW9uIGlzX2Fzc29jaWF0aXZlIChhcnJheSAkYXJyYXkpIHsKICAgIHJldHVybiBhcnJheV9maWx0ZXIoJGFycmF5LCAiaXNfc3RyaW5nIiwgQVJSQVlfRklMVEVSX1VTRV9LRVkpID09IHRydWU7Cn0KCgovKioKICogTGlzdGEgZGUgdGVzdGVzIHF1ZSBhIGZ1bsOnw6NvIGRldmUgc2VyIHN1Ym1ldGlkYS4KICogCiAqIENhZGEgaXRlbSBkYSBsaXN0YSBkZXZlIHNlciB1bSBhcnJheSBjb20gdHLDqnMgw61uZGljZXMuCiAqIE8gcHJpbWVpcm8sICJhcnJheSIsIGNvbSBvIGFycmF5IGEgc2VyIHRlc3RhZG8gcGVsYSBmdW7Dp8Ojby4KICogTyBzZWd1bmRvLCAiaXNfc2VxdWVudGlhbCIsIHVtIHZhbG9yIGJvb2xlYW5vIGVzcGVyYWRvIGNvbW8gcmV0b3JubyBkYSBmdW7Dp8OjbyBpc19zZXF1ZW50aWFsLgogKiBPIHRlcmNlaXJvLCAiaXNfYXNzb2NpYXRpdmUiLCB1bSB2YWxvciBib29sZWFubyBlc3BlcmFkbyBjb21vIHJldG9ybm8gZGEgZnVuw6fDo28gaXNfYXNzb2NpYXRpdmUuCiAqLwoKJHRlc3RzID0gYXJyYXkoKTsKCi8vIFRlc3RlIDE6IEFycmF5IGNvbSDDrW5kaWNlcyBudW3DqXJpY29zIHNlcXVlbmNpYWlzCgokdGVzdHNbXSA9IFsKICAgICJhcnJheSIgPT4gWyJhIiwgImIiLCAiYyIsICJkIiwgImUiXSwgCiAgICAiaXNfc2VxdWVudGlhbCIgPT4gdHJ1ZSwKICAgICJpc19hc3NvY2lhdGl2ZSIgPT4gZmFsc2UKXTsKCi8vIFRlc3RlIDI6IEFycmF5IGFzc29jaWF0aXZvCgokdGVzdHNbXSA9IFsKICAgICJhcnJheSIgPT4gWyJuYW1lIiA9PiAiZm9vIiwgImxhc3RuYW1lIiA9PiAiYmFyIl0sIAogICAgImlzX3NlcXVlbnRpYWwiID0+IGZhbHNlLAogICAgImlzX2Fzc29jaWF0aXZlIiA9PiB0cnVlCl07CgovLyBUZXN0ZSAzOiBBcnJheSBjb20gY2hhdmUgZG8gdGlwbyBzdHJpbmcgY29udGVuZG8gaW50ZWlybyB2w6FsaWRvCgokdGVzdHNbXSA9IFsKICAgICJhcnJheSIgPT4gWyIwIiA9PiAiZm9vIiwgIjEiID0+ICJiYXIiXSwgCiAgICAiaXNfc2VxdWVudGlhbCIgPT4gdHJ1ZSwKICAgICJpc19hc3NvY2lhdGl2ZSIgPT4gZmFsc2UKXTsKCi8vIFRlc3RlIDQ6IEFycmF5IGNvbSDDrW5kaWNlcyBkbyB0aXBvIGZsb2F0CgokdGVzdHNbXSA9IFsKICAgICJhcnJheSIgPT4gWzAuNSA9PiAiZm9vIiwgLTMuNSA9PiAiYmFyIl0sIAogICAgImlzX3NlcXVlbnRpYWwiID0+IHRydWUsCiAgICAiaXNfYXNzb2NpYXRpdmUiID0+IGZhbHNlCl07CgovLyBUZXN0ZSA1OiBBcnJheSBjb20gw61uZGljZXMgZG8gdGlwbyBib29sZWFub3MKCiR0ZXN0c1tdID0gWwogICAgImFycmF5IiA9PiBbdHJ1ZSA9PiAiZm9vIiwgZmFsc2UgPT4gImJhciJdLCAKICAgICJpc19zZXF1ZW50aWFsIiA9PiB0cnVlLAogICAgImlzX2Fzc29jaWF0aXZlIiA9PiBmYWxzZQpdOwoKLy8gVGVzdGUgNjogQXJyYXkgY29tIMOtbmRpY2UgbnVsbwoKJHRlc3RzW10gPSBbCiAgICAiYXJyYXkiID0+IFtudWxsID0+ICJmb28iXSwgCiAgICAiaXNfc2VxdWVudGlhbCIgPT4gZmFsc2UsCiAgICAiaXNfYXNzb2NpYXRpdmUiID0+IHRydWUKXTsKCi8vIFRlc3RlIDc6IEFycmF5IG1pc3RvCgokdGVzdHNbXSA9IFsKICAgICJhcnJheSIgPT4gWyJmb28iLCAiYmF6IiA9PiAiYmFyIl0sIAogICAgImlzX3NlcXVlbnRpYWwiID0+IHRydWUsCiAgICAiaXNfYXNzb2NpYXRpdmUiID0+IHRydWUKXTsKCi8vIFRlc3RlIDg6IEFycmF5IGRlIMOtbmRpY2VzIG51bcOpcmljb3MgZGVzb3JkZW5hZG9zCgokdGVzdHNbXSA9IFsKICAgICJhcnJheSIgPT4gWzEgPT4gImZvbyIsIDAgPT4gImJhciJdLCAKICAgICJpc19zZXF1ZW50aWFsIiA9PiB0cnVlLAogICAgImlzX2Fzc29jaWF0aXZlIiA9PiBmYWxzZQpdOwoKLy8gVGVzdGUgOTogQXJyYXkgZGUgw61uZGljZXMgbnVtw6lyaWNvcyBvcmRlbmFkb3MgbsOjbyBzZXF1ZW5jaWFpcwoKJHRlc3RzW10gPSBbCiAgICAiYXJyYXkiID0+IFswID0+ICJmb28iLCAxID0+ICJiYXIiLCA2ID0+ICJiYXoiXSwgCiAgICAiaXNfc2VxdWVudGlhbCIgPT4gdHJ1ZSwKICAgICJpc19hc3NvY2lhdGl2ZSIgPT4gZmFsc2UKXTsKCgovKioKICogRXhlY3V0YSBvcyB0ZXN0ZXMuCiAqLwogCnRyeSB7CiAgICBmb3JlYWNoICgkdGVzdHMgYXMgJGkgPT4gJHRlc3QpIHsKICAgICAgICBpZiAoJHRlc3RbImlzX3NlcXVlbnRpYWwiXSAhPT0gaXNfc2VxdWVudGlhbCgkdGVzdFsiYXJyYXkiXSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihzcHJpbnRmKCJpc19zZXF1ZW50aWFsOiBBbGdvIGVycmFkbyBuw6NvIGVzdMOhIGNlcnRvISBUZXN0ZSAlZCBmYWxob3UuIiwgJGkrMSkpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoJHRlc3RbImlzX2Fzc29jaWF0aXZlIl0gIT09IGlzX2Fzc29jaWF0aXZlKCR0ZXN0WyJhcnJheSJdKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKHNwcmludGYoImlzX2Fzc29jaWF0aXZlOiBBbGdvIGVycmFkbyBuw6NvIGVzdMOhIGNlcnRvISBUZXN0ZSAlZCBmYWxob3UuIiwgJGkrMSkpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZWNobyAiUGFyYWLDqW5zISBTdWEgZnVuw6fDo28gcGFzc291IGVtIHRvZG9zIG9zIHRlc3Rlcy4iLCBQSFBfRU9MOwp9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgIGVjaG8gJGUtPmdldE1lc3NhZ2UoKSwgUEhQX0VPTDsKfQoK