<?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