<?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 )  { 
} 
 
/** 
 * 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 ) ;      } 
} 
 
PD9waHAKCi8qKgogKiBGdW7Dp8OjbyBxdWUgdGVzdGEgc2UgbyBhcnJheSDDqSBzZXF1ZW5jaWFsLgogKiAKICogQHBhcmFtIGFycmF5IEFycmF5IGEgc2VyIHRlc3RhZG8KICogQHJldHVybiBib29sIFRydWUgc2UgJGFycmF5IGZvciBzZXF1ZW5jaWFsLCBGYWxzZSBjYXNvIGNvbnRyw6FyaW8KICovCgpmdW5jdGlvbiBpc19zZXF1ZW50aWFsICgkYXJyYXkpIHsKICAgIHJldHVybiBzdHJwb3MoanNvbl9lbmNvZGUoJGFycmF5KSwgIlsiKSA9PT0gMDsKfQoKLyoqCiAqIEZ1bsOnw6NvIHF1ZSB0ZXN0YSBzZSBvIGFycmF5IMOpIGFzc29jaWF0aXZvLgogKiAKICogQHBhcmFtIGFycmF5IEFycmF5IGEgc2VyIHRlc3RhZG8KICogQHJldHVybiBib29sIFRydWUgc2UgJGFycmF5IGZvciBhc3NvY2lhdGl2bywgRmFsc2UgY2FzbyBjb250csOhcmlvCiAqLwoKZnVuY3Rpb24gaXNfYXNzb2NpYXRpdmUgKGFycmF5ICRhcnJheSkgewogICAgcmV0dXJuICFpc19zZXF1ZW50aWFsKCRhcnJheSk7Cn0KCi8qKgogKiBMaXN0YSBkZSB0ZXN0ZXMgcXVlIGEgZnVuw6fDo28gZGV2ZSBzZXIgc3VibWV0aWRhLgogKiAKICogQ2FkYSBpdGVtIGRhIGxpc3RhIGRldmUgc2VyIHVtIGFycmF5IGNvbSB0csOqcyDDrW5kaWNlcy4KICogTyBwcmltZWlybywgImFycmF5IiwgY29tIG8gYXJyYXkgYSBzZXIgdGVzdGFkbyBwZWxhIGZ1bsOnw6NvLgogKiBPIHNlZ3VuZG8sICJpc19zZXF1ZW50aWFsIiwgdW0gdmFsb3IgYm9vbGVhbm8gZXNwZXJhZG8gY29tbyByZXRvcm5vIGRhIGZ1bsOnw6NvIGlzX3NlcXVlbnRpYWwuCiAqIE8gdGVyY2Vpcm8sICJpc19hc3NvY2lhdGl2ZSIsIHVtIHZhbG9yIGJvb2xlYW5vIGVzcGVyYWRvIGNvbW8gcmV0b3JubyBkYSBmdW7Dp8OjbyBpc19hc3NvY2lhdGl2ZS4KICovCgokdGVzdHMgPSBhcnJheSgpOwoKLy8gVGVzdGUgMTogQXJyYXkgY29tIMOtbmRpY2VzIG51bcOpcmljb3Mgc2VxdWVuY2lhaXMKCiR0ZXN0c1tdID0gWwogICAgImFycmF5IiA9PiBbImEiLCAiYiIsICJjIiwgImQiLCAiZSJdLCAKICAgICJpc19zZXF1ZW50aWFsIiA9PiB0cnVlLAogICAgImlzX2Fzc29jaWF0aXZlIiA9PiBmYWxzZQpdOwoKLy8gVGVzdGUgMjogQXJyYXkgYXNzb2NpYXRpdm8KCiR0ZXN0c1tdID0gWwogICAgImFycmF5IiA9PiBbIm5hbWUiID0+ICJmb28iLCAibGFzdG5hbWUiID0+ICJiYXIiXSwgCiAgICAiaXNfc2VxdWVudGlhbCIgPT4gZmFsc2UsCiAgICAiaXNfYXNzb2NpYXRpdmUiID0+IHRydWUKXTsKCi8vIFRlc3RlIDM6IEFycmF5IGNvbSBjaGF2ZSBkbyB0aXBvIHN0cmluZyBjb250ZW5kbyBpbnRlaXJvIHbDoWxpZG8KCiR0ZXN0c1tdID0gWwogICAgImFycmF5IiA9PiBbIjAiID0+ICJmb28iLCAiMSIgPT4gImJhciJdLCAKICAgICJpc19zZXF1ZW50aWFsIiA9PiB0cnVlLAogICAgImlzX2Fzc29jaWF0aXZlIiA9PiBmYWxzZQpdOwoKLy8gVGVzdGUgNDogQXJyYXkgY29tIMOtbmRpY2VzIGRvIHRpcG8gZmxvYXQKCiR0ZXN0c1tdID0gWwogICAgImFycmF5IiA9PiBbMC41ID0+ICJmb28iLCAtMy41ID0+ICJiYXIiXSwgCiAgICAiaXNfc2VxdWVudGlhbCIgPT4gdHJ1ZSwKICAgICJpc19hc3NvY2lhdGl2ZSIgPT4gZmFsc2UKXTsKCi8vIFRlc3RlIDU6IEFycmF5IGNvbSDDrW5kaWNlcyBkbyB0aXBvIGJvb2xlYW5vcwoKJHRlc3RzW10gPSBbCiAgICAiYXJyYXkiID0+IFt0cnVlID0+ICJmb28iLCBmYWxzZSA9PiAiYmFyIl0sIAogICAgImlzX3NlcXVlbnRpYWwiID0+IHRydWUsCiAgICAiaXNfYXNzb2NpYXRpdmUiID0+IGZhbHNlCl07CgovLyBUZXN0ZSA2OiBBcnJheSBjb20gw61uZGljZSBudWxvCgokdGVzdHNbXSA9IFsKICAgICJhcnJheSIgPT4gW251bGwgPT4gImZvbyJdLCAKICAgICJpc19zZXF1ZW50aWFsIiA9PiBmYWxzZSwKICAgICJpc19hc3NvY2lhdGl2ZSIgPT4gdHJ1ZQpdOwoKLy8gVGVzdGUgNzogQXJyYXkgbWlzdG8KCiR0ZXN0c1tdID0gWwogICAgImFycmF5IiA9PiBbImZvbyIsICJiYXoiID0+ICJiYXIiXSwgCiAgICAiaXNfc2VxdWVudGlhbCIgPT4gdHJ1ZSwKICAgICJpc19hc3NvY2lhdGl2ZSIgPT4gdHJ1ZQpdOwoKLy8gVGVzdGUgODogQXJyYXkgZGUgw61uZGljZXMgbnVtw6lyaWNvcyBkZXNvcmRlbmFkb3MKCiR0ZXN0c1tdID0gWwogICAgImFycmF5IiA9PiBbMSA9PiAiZm9vIiwgMCA9PiAiYmFyIl0sIAogICAgImlzX3NlcXVlbnRpYWwiID0+IHRydWUsCiAgICAiaXNfYXNzb2NpYXRpdmUiID0+IGZhbHNlCl07CgovLyBUZXN0ZSA5OiBBcnJheSBkZSDDrW5kaWNlcyBudW3DqXJpY29zIG9yZGVuYWRvcyBuw6NvIHNlcXVlbmNpYWlzCgokdGVzdHNbXSA9IFsKICAgICJhcnJheSIgPT4gWzAgPT4gImZvbyIsIDEgPT4gImJhciIsIDYgPT4gImJheiJdLCAKICAgICJpc19zZXF1ZW50aWFsIiA9PiB0cnVlLAogICAgImlzX2Fzc29jaWF0aXZlIiA9PiBmYWxzZQpdOwoKCi8qKgogKiBFeGVjdXRhIG9zIHRlc3Rlcy4KICovCiAKZm9yZWFjaCAoJHRlc3RzIGFzICRpID0+ICR0ZXN0KSB7CiAgICBpZiAoJHRlc3RbImlzX3NlcXVlbnRpYWwiXSAhPT0gaXNfc2VxdWVudGlhbCgkdGVzdFsiYXJyYXkiXSkpIHsKICAgICAgICBlY2hvIHNwcmludGYoImlzX3NlcXVlbnRpYWw6IEFsZ28gZXJyYWRvIG7Do28gZXN0w6EgY2VydG8hIFRlc3RlICVkIGZhbGhvdS5cbiIsICRpKzEpOwogICAgfQogICAgCiAgICBpZiAoJHRlc3RbImlzX2Fzc29jaWF0aXZlIl0gIT09IGlzX2Fzc29jaWF0aXZlKCR0ZXN0WyJhcnJheSJdKSkgewogICAgICAgIGVjaG8gc3ByaW50ZigiaXNfYXNzb2NpYXRpdmU6IEFsZ28gZXJyYWRvIG7Do28gZXN0w6EgY2VydG8hIFRlc3RlICVkIGZhbGhvdS5cbiIsICRpKzEpOwogICAgfQp9Cg==