<?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 )  { 
    for ( $x  =  0 ;  $x  <  count ( $array ) ;  $x ++ ) {              return  false ; 
        } 
    } 
 
    return  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  ! is_sequential( $array ) ; 
} 
 
/** 
 * 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. 
 */ 
 
foreach  ( $tests  as  $i  =>  $test )  { 
    if  ( $test [ "is_sequential" ]  !==  is_sequential( $test [ "array" ] ) )  { 
        echo  sprintf ( "is_sequential: Algo errado não está certo! Teste %d  falhou.\n " ,  $i + 1 ) ;      } 
 
    if  ( $test [ "is_associative" ]  !==  is_associative( $test [ "array" ] ) )  { 
        echo  sprintf ( "is_associative: Algo errado não está certo! Teste %d  falhou.\n " ,  $i + 1 ) ;      } 
} 
 
PD9waHAKCi8qKgogKiBGdW7Dp8OjbyBxdWUgdGVzdGEgc2UgbyBhcnJheSDDqSBzZXF1ZW5jaWFsLgogKiAKICogQHBhcmFtIGFycmF5IEFycmF5IGEgc2VyIHRlc3RhZG8KICogQHJldHVybiBib29sIFRydWUgc2UgJGFycmF5IGZvciBzZXF1ZW5jaWFsLCBGYWxzZSBjYXNvIGNvbnRyw6FyaW8KICovCgpmdW5jdGlvbiBpc19zZXF1ZW50aWFsICgkYXJyYXkpIHsKICAgIGZvcigkeCA9IDA7ICR4IDwgY291bnQoJGFycmF5KTsgJHgrKyl7CiAgICAgICAgaWYoYXJyYXlfa2V5X2V4aXN0cygkeCwgJGFycmF5KSA9PSBmYWxzZSl7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybiB0cnVlOwp9CgovKioKICogRnVuw6fDo28gcXVlIHRlc3RhIHNlIG8gYXJyYXkgw6kgYXNzb2NpYXRpdm8uCiAqIAogKiBAcGFyYW0gYXJyYXkgQXJyYXkgYSBzZXIgdGVzdGFkbwogKiBAcmV0dXJuIGJvb2wgVHJ1ZSBzZSAkYXJyYXkgZm9yIGFzc29jaWF0aXZvLCBGYWxzZSBjYXNvIGNvbnRyw6FyaW8KICovCgpmdW5jdGlvbiBpc19hc3NvY2lhdGl2ZSAoYXJyYXkgJGFycmF5KSB7CiAgICByZXR1cm4gIWlzX3NlcXVlbnRpYWwoJGFycmF5KTsKfQoKLyoqCiAqIExpc3RhIGRlIHRlc3RlcyBxdWUgYSBmdW7Dp8OjbyBkZXZlIHNlciBzdWJtZXRpZGEuCiAqIAogKiBDYWRhIGl0ZW0gZGEgbGlzdGEgZGV2ZSBzZXIgdW0gYXJyYXkgY29tIHRyw6pzIMOtbmRpY2VzLgogKiBPIHByaW1laXJvLCAiYXJyYXkiLCBjb20gbyBhcnJheSBhIHNlciB0ZXN0YWRvIHBlbGEgZnVuw6fDo28uCiAqIE8gc2VndW5kbywgImlzX3NlcXVlbnRpYWwiLCB1bSB2YWxvciBib29sZWFubyBlc3BlcmFkbyBjb21vIHJldG9ybm8gZGEgZnVuw6fDo28gaXNfc2VxdWVudGlhbC4KICogTyB0ZXJjZWlybywgImlzX2Fzc29jaWF0aXZlIiwgdW0gdmFsb3IgYm9vbGVhbm8gZXNwZXJhZG8gY29tbyByZXRvcm5vIGRhIGZ1bsOnw6NvIGlzX2Fzc29jaWF0aXZlLgogKi8KCiR0ZXN0cyA9IGFycmF5KCk7CgovLyBUZXN0ZSAxOiBBcnJheSBjb20gw61uZGljZXMgbnVtw6lyaWNvcyBzZXF1ZW5jaWFpcwoKJHRlc3RzW10gPSBbCiAgICAiYXJyYXkiID0+IFsiYSIsICJiIiwgImMiLCAiZCIsICJlIl0sIAogICAgImlzX3NlcXVlbnRpYWwiID0+IHRydWUsCiAgICAiaXNfYXNzb2NpYXRpdmUiID0+IGZhbHNlCl07CgovLyBUZXN0ZSAyOiBBcnJheSBhc3NvY2lhdGl2bwoKJHRlc3RzW10gPSBbCiAgICAiYXJyYXkiID0+IFsibmFtZSIgPT4gImZvbyIsICJsYXN0bmFtZSIgPT4gImJhciJdLCAKICAgICJpc19zZXF1ZW50aWFsIiA9PiBmYWxzZSwKICAgICJpc19hc3NvY2lhdGl2ZSIgPT4gdHJ1ZQpdOwoKLy8gVGVzdGUgMzogQXJyYXkgY29tIGNoYXZlIGRvIHRpcG8gc3RyaW5nIGNvbnRlbmRvIGludGVpcm8gdsOhbGlkbwoKJHRlc3RzW10gPSBbCiAgICAiYXJyYXkiID0+IFsiMCIgPT4gImZvbyIsICIxIiA9PiAiYmFyIl0sIAogICAgImlzX3NlcXVlbnRpYWwiID0+IHRydWUsCiAgICAiaXNfYXNzb2NpYXRpdmUiID0+IGZhbHNlCl07CgovLyBUZXN0ZSA0OiBBcnJheSBjb20gw61uZGljZXMgZG8gdGlwbyBmbG9hdAoKJHRlc3RzW10gPSBbCiAgICAiYXJyYXkiID0+IFswLjUgPT4gImZvbyIsIC0zLjUgPT4gImJhciJdLCAKICAgICJpc19zZXF1ZW50aWFsIiA9PiB0cnVlLAogICAgImlzX2Fzc29jaWF0aXZlIiA9PiBmYWxzZQpdOwoKLy8gVGVzdGUgNTogQXJyYXkgY29tIMOtbmRpY2VzIGRvIHRpcG8gYm9vbGVhbm9zCgokdGVzdHNbXSA9IFsKICAgICJhcnJheSIgPT4gW3RydWUgPT4gImZvbyIsIGZhbHNlID0+ICJiYXIiXSwgCiAgICAiaXNfc2VxdWVudGlhbCIgPT4gdHJ1ZSwKICAgICJpc19hc3NvY2lhdGl2ZSIgPT4gZmFsc2UKXTsKCi8vIFRlc3RlIDY6IEFycmF5IGNvbSDDrW5kaWNlIG51bG8KCiR0ZXN0c1tdID0gWwogICAgImFycmF5IiA9PiBbbnVsbCA9PiAiZm9vIl0sIAogICAgImlzX3NlcXVlbnRpYWwiID0+IGZhbHNlLAogICAgImlzX2Fzc29jaWF0aXZlIiA9PiB0cnVlCl07CgovLyBUZXN0ZSA3OiBBcnJheSBtaXN0bwoKJHRlc3RzW10gPSBbCiAgICAiYXJyYXkiID0+IFsiZm9vIiwgImJheiIgPT4gImJhciJdLCAKICAgICJpc19zZXF1ZW50aWFsIiA9PiB0cnVlLAogICAgImlzX2Fzc29jaWF0aXZlIiA9PiB0cnVlCl07CgovLyBUZXN0ZSA4OiBBcnJheSBkZSDDrW5kaWNlcyBudW3DqXJpY29zIGRlc29yZGVuYWRvcwoKJHRlc3RzW10gPSBbCiAgICAiYXJyYXkiID0+IFsxID0+ICJmb28iLCAwID0+ICJiYXIiXSwgCiAgICAiaXNfc2VxdWVudGlhbCIgPT4gdHJ1ZSwKICAgICJpc19hc3NvY2lhdGl2ZSIgPT4gZmFsc2UKXTsKCi8vIFRlc3RlIDk6IEFycmF5IGRlIMOtbmRpY2VzIG51bcOpcmljb3Mgb3JkZW5hZG9zIG7Do28gc2VxdWVuY2lhaXMKCiR0ZXN0c1tdID0gWwogICAgImFycmF5IiA9PiBbMCA9PiAiZm9vIiwgMSA9PiAiYmFyIiwgNiA9PiAiYmF6Il0sIAogICAgImlzX3NlcXVlbnRpYWwiID0+IHRydWUsCiAgICAiaXNfYXNzb2NpYXRpdmUiID0+IGZhbHNlCl07CgoKLyoqCiAqIEV4ZWN1dGEgb3MgdGVzdGVzLgogKi8KIApmb3JlYWNoICgkdGVzdHMgYXMgJGkgPT4gJHRlc3QpIHsKICAgIGlmICgkdGVzdFsiaXNfc2VxdWVudGlhbCJdICE9PSBpc19zZXF1ZW50aWFsKCR0ZXN0WyJhcnJheSJdKSkgewogICAgICAgIGVjaG8gc3ByaW50ZigiaXNfc2VxdWVudGlhbDogQWxnbyBlcnJhZG8gbsOjbyBlc3TDoSBjZXJ0byEgVGVzdGUgJWQgZmFsaG91LlxuIiwgJGkrMSk7CiAgICB9CiAgICAKICAgIGlmICgkdGVzdFsiaXNfYXNzb2NpYXRpdmUiXSAhPT0gaXNfYXNzb2NpYXRpdmUoJHRlc3RbImFycmF5Il0pKSB7CiAgICAgICAgZWNobyBzcHJpbnRmKCJpc19hc3NvY2lhdGl2ZTogQWxnbyBlcnJhZG8gbsOjbyBlc3TDoSBjZXJ0byEgVGVzdGUgJWQgZmFsaG91LlxuIiwgJGkrMSk7CiAgICB9Cn0K