-
Notifications
You must be signed in to change notification settings - Fork 0
/
menu.php
155 lines (141 loc) · 4.53 KB
/
menu.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
<?php
// EXERCÍCIO:
// 1) Crie a opção para ALTERAR um contato. Para isso,
// faça como a opção REMOVER e solicite a posição do
// contato a ser alterada. Então, os dados.
// 2) Crie uma validação para os contatos, com as seguintes
// regras:
// a) o nome deve ter de 2 a 100 caracteres;
// b) o telefone deve ter no máximo 10 caracteres.
// Crie uma única função de validação e a reutilize
// nas operações de cadastro e alteração.
// Se os dados não passarem na validação, informe o
// usuário e não realize a operação de cadastro/alteração.
const OPCAO_SAIR = '0';
const OPCAO_LISTAR = '1';
const OPCAO_CADASTRAR = '2';
const OPCAO_REMOVER = '3';
const OPCAO_ALTERAR = '4';
const OPCAO_SALVAR = '5';
const OPCAO_CARREGAR = '6';
$contatos = [];
do {
echo 'Menu:', PHP_EOL;
desenharLinha();
echo '0) Sair', PHP_EOL;
echo '1) Listar', PHP_EOL;
echo '2) Cadastrar', PHP_EOL;
echo '3) Remover', PHP_EOL;
echo '4) Alterar', PHP_EOL;
echo '5) Salvar para arquivo', PHP_EOL;
echo '6) Carregar de arquivo', PHP_EOL;
desenharLinha();
$opcao = readline( 'Opção: ' );
switch ( $opcao ) {
case OPCAO_SAIR: break;
case OPCAO_LISTAR: listar( $contatos ); break;
case OPCAO_CADASTRAR: cadastrar( $contatos ); break;
case OPCAO_REMOVER: remover( $contatos ); break;
case OPCAO_ALTERAR: alterar( $contatos ); break;
case OPCAO_SALVAR: salvarParaArquivo( $contatos ); break;
case OPCAO_CARREGAR: $contatos = carregarDeArquivo(); break;
default: echo 'Opção inválida.', PHP_EOL;
}
} while ( $opcao != OPCAO_SAIR );
function cadastrar( &$contatos ) {
echo 'Cadastro', PHP_EOL;
desenharLinha();
$nome = readline( 'Nome: ' );
$telefone = readline( 'Telefone: ' );
$problemas = validarDadosContato( $nome, $telefone );
if ( count( $problemas ) > 0 ) {
echo implode( PHP_EOL, $problemas );
} else {
$contato = [ 'nome' => $nome, 'telefone' => $telefone];
$contatos []= $contato; // array_push( $contatos, $contato );
}
}
function listar( $contatos ) {
echo 'Listagem', PHP_EOL;
desenharLinha();
foreach ( $contatos as $indice => $c ) {
echo $indice + 1, ') ', $c[ 'nome' ], ' - ', $c[ 'telefone' ], PHP_EOL;
}
desenharLinha();
}
function remover( &$contatos ) {
echo 'Remoção', PHP_EOL;
desenharLinha();
$posicao = solicitarPosicao( $contatos);
if ( $posicao >= 0) {
unset( $contatos[ $posicao ] );
echo 'Removido.', PHP_EOL;
} else {
echo 'Posição inválida.', PHP_EOL;
}
}
function alterar( &$contatos ) {
echo 'Alteração', PHP_EOL;
desenharLinha();
$posicao = solicitarPosicao( $contatos );
if ( $posicao >= 0 ) {
$nome = readline( 'Nome: ' );
$telefone = readline( 'Telefone: ' );
$problemas = validarDadosContato( $nome, $telefone );
if ( count( $problemas ) > 0 ) {
echo implode( PHP_EOL, $problemas );
} else {
$contatos[ $posicao ][ 'nome' ] = $nome;
$contatos[ $posicao ][ 'telefone' ] = $telefone;
}
echo 'Alterado.', PHP_EOL;
} else {
echo 'Posição inválida.', PHP_EOL;
}
}
function salvarParaArquivo ( $contatos ) {
$json = json_encode( $contatos, JSON_PRETTY_PRINT ); // gera string
file_put_contents( 'contatos.json', $json );
echo 'Salvo.', PHP_EOL;
}
function carregarDeArquivo() {
$json = file_get_contents( 'contatos.json' );
return json_decode( $json, true ); // gera array
echo 'Carregado.', PHP_EOL;
}
/**
* Valida os dados de um contato.
*
* @param string $nome
* @param string $telefone
* @return array<string>
*/
function validarDadosContato( $nome, $telefone ) {
$problemas = [];
// Nome
$tamanhoNome = mb_strlen( $nome );
if ( $tamanhoNome < 2 ) {
$problemas [] = 'Nome deve ter pelo menos 2 caracteres.';
} else if ( $tamanhoNome > 100 ) {
$problemas [] = 'Nome deve ter no máximo 100 caracteres.';
}
// Telefone
$tamanhoTelefone = mb_strlen( $telefone );
if ( $tamanhoTelefone > 10 ) {
$problemas [] = 'Telefone deve ter no máximo 10 caracteres.';
}
return $problemas;
}
function solicitarPosicao( $contatos ) {
$posicao = readline( 'Posição a alterar: ' );
if ( is_numeric( $posicao ) &&
array_key_exists( $posicao - 1, $contatos )
) {
return (int) $posicao - 1;
}
return -1;
}
function desenharLinha() {
echo str_repeat( '-', 20 ), PHP_EOL;
}
?>