2
respostas

[APRESENTAÇÃO/DÚVIDA] Código diferente, onde escolhemos a conta e o valor a depositar e sacar.

Gostaria apenas de apresentar meu código neste post.

Fiz algumas pesquisas na internet, algumas variações, e para escolher a conta corrente, tive que deixar como index numérico as keys, para facilitar para o usuário escolher o cliente o qual ele quer executar a operação, vide código abaixo:

<?php

function exibeMensagem(string $mensagem)
{
    echo $mensagem .PHP_EOL;
}

function sacar(array $conta, float $valorASacar) : array
{
    if ($valorASacar > $conta['saldo']) {
        exibeMensagem("Você não tem saldo para sacar este valor, pois seu saldo é de " . $conta['saldo']);
    } else {
        $conta['saldo'] -= $valorASacar;
    }
    return $conta;
}

function depositar(array $conta, float $valorADepositar) : array
{
    if ($valorADepositar < 0) {
        exibeMensagem("Você não pode depositar valor negativo");
    } else {
        $conta['saldo'] += $valorADepositar;
    }
    return $conta;
}

function exibeContas($clientes)
{
    for ($i = 0; $i < count($clientes); $i++) {
        exibeMensagem( 'Índice: ' . $i+1 .
            " | CPF:" . $clientes[$i]['cpf'] .
            " | Titular:" . $clientes[$i]['titular'] .
            " | Saldo: R$" . number_format($clientes[$i]['saldo'], 2, ",", "."));
    }
}

$contasCorrentes = [
    [
        'cpf' => '123.456.789-10',
        'titular' => 'Maria',
        'saldo' => 10000
    ],
    [
        'cpf' => '123.456.789-11',
            'titular' => 'Alberto',
        'saldo' => 300
    ],
    [
        'cpf' => '123.456.789-12',
        'titular' => 'Vinicius',
        'saldo' => 100
    ]
];


echo PHP_EOL;
exibeContas($contasCorrentes);
echo PHP_EOL;
$contaEscolhinda = readline("Escolha uma conta para sacar:" )-1;

exibeMensagem(PHP_EOL . "------------------- CONTA ESCOLHIDA -------------------"
    . PHP_EOL . PHP_EOL . "CPF:" . $contasCorrentes[$contaEscolhinda]['cpf'] .
    " | Titular:" . $contasCorrentes[$contaEscolhinda]['titular'] .
    " | Saldo: R$" . number_format($contasCorrentes[$contaEscolhinda]['saldo'], 2, ",", ".")
    . PHP_EOL . PHP_EOL . "-------------------------------------------------------" . PHP_EOL);

echo PHP_EOL;
$valorASacarEscolhido = readline( "Quanto você quer sacar: ");
echo PHP_EOL;

$contasCorrentes[$contaEscolhinda] = sacar($contasCorrentes[$contaEscolhinda],$valorASacarEscolhido);

/*$contasCorrentes['123.456.789-10']['saldo'] -= 500;
if (500 > $contasCorrentes['123.456.789-11']['saldo']) {
    exibeMensagem("Você não pode sacar este valor.");               //TRANSFORMAR ISTO EM FUNÇÃO
} else {
    $contasCorrentes['123.456.789-11']['saldo'] -= 500;
}*/

//$contasCorrentes['123.456.789-10'] = sacar($contasCorrentes['123.456.789-10'], 500); //fazer para uma conta especifica

foreach ($contasCorrentes as $cpf => $conta) {
    exibeMensagem($cpf + 1 .
        " | CPF:" . $conta['cpf'] .
        " | Titular:" . $conta['titular'] .
        " | Saldo: R$" . number_format($conta['saldo'], 2, ",", "."));
}


echo PHP_EOL;
exibeContas($contasCorrentes);
echo PHP_EOL;
$contaEscolhinda = readline("Escolha uma conta para depositar:" )-1;

exibeMensagem(PHP_EOL . "------------------- CONTA ESCOLHIDA -------------------"
    . PHP_EOL . PHP_EOL . "CPF:" . $contasCorrentes[$contaEscolhinda]['cpf'] .
    " | Titular:" . $contasCorrentes[$contaEscolhinda]['titular'] .
    " | Saldo: R$" . number_format($contasCorrentes[$contaEscolhinda]['saldo'], 2, ",", ".")
    . PHP_EOL . PHP_EOL . "-------------------------------------------------------" . PHP_EOL);

echo PHP_EOL;
$valorADepositarEscolhido = readline( "Quanto você quer depositar: ");
echo PHP_EOL;

$contasCorrentes[$contaEscolhinda] = depositar($contasCorrentes[$contaEscolhinda],$valorADepositarEscolhido);

foreach ($contasCorrentes as $cpf => $conta) {
    exibeMensagem($cpf + 1 .
        " | CPF:" . $conta['cpf'] .
        " | Titular:" . $conta['titular'] .
        " | Saldo: R$" . number_format($conta['saldo'], 2, ",", "."));
}

O código funciona desta maneira, utilizando keys numéricas, visto que eu tirei a definição da key pelo CPF.

Se eu mantivesse a key como CPF, eu consigo dentro de um foreach ou até de um for, identificar cada um dos elementos dentro do array, para que o usuário escolha através de um número qual cliente ele quer, e retorne para o programa o cliente escolhido através do CPF novamente?

Tentei coisas do tipo:

function exibeContas($clientes)
{
    for ($i = 0; $i < count($clientes); $i++) {
        exibeMensagem($i .                                                      //NÃO ESTÁ FUNCIONANDO
            " | Titular:" . $clientes[$i]['titular'] .
            " | Saldo: R$" . number_format($clientes[$i]['saldo'], 2, ",", "."));
    }
}

Onde eu tirei o CPF (pois não sabia como representar o cpf do cliente dentro de um for (no foreach usamos o $identificador => $identificador2).

2 respostas

Pelo que li no php.net, quando definimos uma key de um array como string, não conseguimos mais usar os indices dele como valor numérico sequencial a partir do 0. É isto mesmo? Ou conseguimos ainda usar esta "propriedade"? Pois assim resolveria os problemas, acredito eu.

Olá, Felipe. Tudo bem?

Gostaria de pedir desculpas pela demora em responder o seu tópico!

Sobre a sua dúvida:

Se eu mantivesse a key como CPF, eu consigo dentro de um foreach ou até de um for, identificar cada um dos elementos dentro do array, para que o usuário escolha através de um número qual cliente ele quer, e retorne para o programa o cliente escolhido através do CPF novamente?

"Para que o usuário escolha através de um número qual cliente ele quer", o número seria o número de CPF, ou da forma como você implementou, você retirou o CPF como chave e adiciou um índice, essa é uma forma válida também :)

Sobre sua outra dúvida:

Pelo que li no php.net, quando definimos uma key de um array como string, não conseguimos mais usar os índices dele como valor numérico sequencial a partir do 0. É isto mesmo? Ou conseguimos ainda usar esta "propriedade"? Pois assim resolveria os problemas, acredito eu.

Até consegue usar como índice, mas não os valores que você já adicionou, por exemplo, veja o exemplo de código abaixo:

<?php

$contasCorrentes = [
    '123.456.789-10' => [
        'titular' => 'Maria',
        'saldo' => 10000
    ],
    '123.456.689-11' => [
        'titular' => 'Alberto',
        'saldo' => 300
    ],
    '123.256.789-12' => [
        'titular' => 'Vinicius',
        'saldo' => 100
    ]
];

$conta = [
    'titular' => "Valente",
    'saldo' => 200
];
array_push($contasCorrentes, $conta);
array_push($contasCorrentes, $conta);

var_dump($contasCorrentes);

O resultado será este:

array(5) {
  ["123.456.789-10"]=>
  array(2) {
    ["titular"]=>
    string(5) "Maria"
    ["saldo"]=>
    int(10000)
  }
  ["123.456.689-11"]=>
  array(2) {
    ["titular"]=>
    string(7) "Alberto"
    ["saldo"]=>
    int(300)
  }
  ["123.256.789-12"]=>
  array(2) {
    ["titular"]=>
    string(8) "Vinicius"
    ["saldo"]=>
    int(100)
  }
  [0]=>
  array(2) {
    ["titular"]=>
    string(7) "Valente"
    ["saldo"]=>
    int(200)
  }
  [1]=>
  array(2) {
    ["titular"]=>
    string(7) "Valente"
    ["saldo"]=>
    int(200)
  }
}

Veja que este código adicionou 2 novas contas a este array, e são contas onde eu não defini o CPF como chave, não coloquei nada. E usei a função array_push para adicionar este valores ao final deste array. Então, o resultado obtido foi 0 e 1 como chave dos novos elementos deste array.

Isso acontece porque o PHP entende por debaixo dos panos como lidar com essa situação, ele sabe a estrutura do array atual, então ele vai tentar seguir a mesma linha, entretanto, ele adicionou novos índices de forma numérica sequencial.

Espero ter ajudado e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓