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