Create array through function

0

Is there any way to return an array , something like:

$array = [
     "parcela" => "1",
     "valor"   => "100",
];

Using the function below? I need to return an array with the number of parcels and the value.:

function calcParcelaJuros($valor_total,$parcelas,$juros=0){
   if($juros==0){
      $string = 'PARCELA - VALOR <br />';
      for($i=1;$i<($parcelas+1);$i++){
         $string .= $i.'x (Sem Juros) - R$ '.number_format($valor_total/$parcelas, 2, ",", ".").' <br />';
      }
      return $string;
   }else{
      $string = 'PARCELA - VALOR <br />';
      for($i=1;$i<($parcelas+1);$i++){
         $I =$juros/100.00;
         $valor_parcela = $valor_total*$I*pow((1+$I),$parcelas)/(pow((1+$I),$parcelas)-1);
         $string .= $i.'x (Juros de: '.$juros.'%) - R$ '.number_format($valor_parcela, 2, ",", ".").' <br />';
      }
      return $string;
   }
}



print(calcParcelaJuros(250,4,2));

?>
    
asked by anonymous 31.08.2018 / 17:31

1 answer

1

Yes, you can return a filled array and then use this to display the information, for example

<?php

function calcParcelaJuros($valor_total, $parcelas, $juros = 0){
    $parcelado = [];

    if ($juros > 0) { // se for com juros, calculamos o valor contando com o juro
        $I = $juros/100.00;
        $valor = $valor_total * $I * pow((1 + $I), $parcelas) / (pow((1 + $I), $parcelas) - 1);
    } else { // senao é porque é sem juro
        $valor = $valor_total / $parcelas; 
    }

    // em vez de usar um ciclo, fazemos um array_fill, do indice 1 até ao numero de $parcelas e colocamos o valor
    $parcelado = array_fill(1, $parcelas, $valor);

    return $parcelado;
}

// presumo que ja tenhas as variaveis assim
$o_valor_total = 250;
$o_numero_de_parcelas = 4;
$o_valor_dos_juros = 2;

$parcelado = calcParcelaJuros($o_valor_total, $o_numero_de_parcelas, $o_valor_dos_juros);

foreach ($parcelado as $parcela => $valor) {
    $nota = ($o_valor_dos_juros > 0) ? "Juros de: {$o_valor_dos_juros}%" : "Sem Juros";
    $valor_formatado = number_format($valor, 2, ",", ".");

    echo "{$parcela}x ({$nota}) - R$ {$valor_formatado} <br />";
}

I prefer to create my functions with only 1 responsibility, and the example above is only the function that calculates the parcels, it would have another to show the result formatted as intended (above is foreach ).

Edit

To add the expiration date, you can do something like this, although, as you say in the comment, you could also do only one cycle to populate the array.

<?php

function calcParcelaJuros($valor_total, $parcelas, $data_primeiro_vencimento, $juros = 0){
    $parcelado = [];

    if ($juros > 0) { // se for com juros, calculamos o valor contando com o juro
        $I = $juros/100.00;
        $valor = $valor_total * $I * pow((1 + $I), $parcelas) / (pow((1 + $I), $parcelas) - 1);
    } else { // senao é porque é sem juro
        $valor = $valor_total / $parcelas; 
    }

    // em vez de usar um ciclo, fazemos um array_fill, do indice 1 até ao numero de $parcelas e colocamos o valor
    $parcelado = array_fill(1, $parcelas, ['valor' => $valor, 'juro' => $juros]);

    // adicionamos as datas entao depois, embora pudessemos fazer tudo no mesmo ciclo..
    foreach ($parcelado as $p => $parcela) {
        if (empty($data_vencimento)) {
            $data_vencimento = $data_primeiro_vencimento;
        } else {
            $data_vencimento = date_add($data_vencimento, date_interval_create_from_date_string('30 days'));
        }

        $parcelado[$p]['parcela'] = $p; // para manter o numero do pagamento
        $parcelado[$p]['data_vencimento'] = $data_vencimento->format('Y-m-d');
    }

    return $parcelado;
}

// presumo que ja tenhas as variaveis assim
$o_valor_total = 250;
$o_numero_de_parcelas = 4;
$data_primeiro_vencimento = date_create('2018-01-31');
$o_valor_dos_juros = 2;

$parcelado = calcParcelaJuros($o_valor_total, $o_numero_de_parcelas, $data_primeiro_vencimento, $o_valor_dos_juros);

foreach ($parcelado as $parcela) {
    extract($parcela); // usamos o extract para as chaves do array serem variaveis dentro deste foreach

    $nota = ($juro > 0) ? "Juros de: {$juro}%" : "Sem Juros";
    $valor_formatado = number_format($valor, 2, ",", ".");

    echo "{$parcela}x ({$nota}) - R$ {$valor_formatado} (Vence em {$data_vencimento})<br />";
}
    
31.08.2018 / 18:35