NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Tereza Rezková:7.11.2022 14:56

Ahoj, potřebovala bych u kódu nahradit match pomocí swtich.

Když se o to pokouším sama tak mi to moc nejde.

Zkusil jsem: <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Kalkulač­ka</title>
</head>
<body>
<!-- Formulář -->
<form method="post">
<table border="0">
<tr>
<td><input name="prvniHodnota" size="3"></td>
</tr>
<tr>
<td>Operace</td>
<td>
<select name="operace">
<option>+</option>
<option>-</option>
<option></option>
<option>/</option>
</select>
</td>
</tr>
<tr>
<td>Druhá hodnota</td>
<td><input name="druhaHodnota" size="3"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="do" value="Spočítat"></td>
</tr>
</table>
</form>
<!-- Přebrání hodnot -->
<?php
// Ověříme si vstupní hodnotu pomocí vlastní funkce
$do = filter_input(IN­PUT_POST, 'do', FILTER_CALLBACK, array(
'options' => function($input){
$return = false;
if($input == 'Spočítat'){
$return = true;
}
return $return;
}
));
// V případě že $_POST['do'] vrátí Spočítat, výsledekem proměnné $do je true
// v opačném případě je false
if($do){
$prvniHodnota = filter_input(IN­PUT_POST, 'prvniHodnota', FILTER_SANITI­ZE_NUMBER_INT);
$druhaHodnota = filter_input(IN­PUT_POST, 'druhaHodnota', FILTER_SANITI­ZE_NUMBER_INT);
$operace = filter_input(IN­PUT_POST, 'operace', FILTER_CALLBACK, array(
'options' => function($input){
$allowValues = array('+', '-', '
', '/');
$return = null;
if(in_array($input, $allowValues)){
$return = $input;
}else{
$return = $allowValues[0];
}
return $return;
}
));
$chyby = array();
if(empty($prvni­Hodnota)){
$chyby[] = 'První hodnota nebyla zadána';
}
if(empty($dru­haHodnota)){
$chyby[] = 'Druhá hodnota nebyla zadána';
}
if(count($chyby) == 0){
$vysledek = null;
switch($operace){
case '+':
$vysledek = $prvniHodnota + $druhaHodnota;
break;
case '-':
$vysledek = $prvniHodnota - $druhaHodnota;
break;
case '*':
$vysledek = $prvniHodnota * $druhaHodnota;
break;
case '/':
$vysledek = $prvniHodnota / $druhaHodnota;
break;
}
echo "<h2>Výsledek</h2>";
echo "Výsledek operace ".$prvniHodno­ta.$operace.$dru­haHodnota." je: " . $vysledek;
}else{
echo "<h2>Výpis chyb</h2>";
echo "<ul>";
foreach($chyby as $chyba){
echo "<li>{$chyba}</li>";
}
echo "</ul>";
}
}
?>
</body>
</html>

Chci docílit: potřebuju vytvořit samostatnou třídu pro match

 
Odpovědět
7.11.2022 14:56
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:7.11.2022 15:39
  1. pouzivej pro psani kodu tlacitko editoru vlozit kod, </>
  2. php zpracuje pred echo vypisem do promenych, muze ti to pozdeji usnadnit praci a vyhnout se zbytecnym chybam

Chci docílit: potřebuju vytvořit samostatnou třídu pro match
To moc nechapu, zkus pridat zmenu v kodu, jak by to melo vypadat.

Takto bych pro zacatek upravil kod (a odstranil jsem chybky, ktere do nej pridava forko, kdyz nepouzijes tlacitko vlozit kod)
U formatovani kodu jsem pouzil program, takze to neni uplne dokonale.

<?php
// Přebrání hodnot

$out = ''; //pp

// Ověříme si vstupní hodnotu pomocí vlastní funkce
$do = filter_input(INPUT_POST, "do", FILTER_CALLBACK, [
    "options" => function ($input) {
        $return = false;
        if ($input == "Spočítat") {
            $return = true;
        }
        return $return;
    },
]);
// V případě že $_POST['do'] vrátí Spočítat, výsledekem proměnné $do je true
// v opačném případě je false
if ($do) {
    $prvniHodnota = filter_input(
        INPUT_POST,
        "prvniHodnota",
        FILTER_SANITIZE_NUMBER_INT
    );
    $druhaHodnota = filter_input(
        INPUT_POST,
        "druhaHodnota",
        FILTER_SANITIZE_NUMBER_INT
    );
    $operace = filter_input(INPUT_POST, "operace", FILTER_CALLBACK, [
        "options" => function ($input) {
            $allowValues = ["+", "-", "*", "/"]; //pp *
            $return = null;
            if (in_array($input, $allowValues)) {
                $return = $input;
            } else {
                $return = $allowValues[0];
            }
            return $return;
        },
    ]);
    $chyby = [];
    if (empty($prvniHodnota)) {
        $chyby[] = "První hodnota nebyla zadána";
    }
    if (empty($druhaHodnota)) {
        $chyby[] = "Druhá hodnota nebyla zadána";
    }
    if (count($chyby) == 0) {
        $vysledek = null;
        switch ($operace) {
            case "+":
                $vysledek = $prvniHodnota + $druhaHodnota;
                break;
            case "-":
                $vysledek = $prvniHodnota - $druhaHodnota;
                break;
            case "*":
                $vysledek = $prvniHodnota * $druhaHodnota;
                break;
            case "/":
                $vysledek = $prvniHodnota / $druhaHodnota;
                break;
            default: break; //pp
        }
 //pp $out
        $out .= "<h2>Výsledek</h2>";
        $out .= "Výsledek operace " .
            $prvniHodnota .
            $operace .
            $druhaHodnota .
            " je: " .
            $vysledek;
    } else {
 //pp $out
        $out .= "<h2>Výpis chyb</h2>";
        $out .= "<ul>";
        foreach ($chyby as $chyba) {
            $out .= "<li>{$chyba}</li>";
        }
        $out .= "</ul>";
    }
}
?>

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Kalkulačka
  </title>
</head>
<body>
  <!-- Formulář -->
  <form method="post">
    <table border="0">
      <tr><td>
          <input name="prvniHodnota" size="10" placeholder="Prvni hodnota"></td> <!-- pp placeholder -->
      <!--/tr-->
      <!--tr><td>Operace</td--><td>
          <select name="operace">
            <optgroup label="operace"> <!-- pp * -->
              <option>+</option>
              <option>-</option>
              <option>*</option> <!-- pp * -->
              <option>/</option>
            </optgroup>
          </select></td>
      <!--/tr>
      <tr><td>Druhá hodnota</td--><td>
          <input name="druhaHodnota" size="10" placeholder="Druhá hodnota"></td> <!-- pp placeholder -->
      <!--/tr>
      <tr><td></td--><td>
          <input type="submit" name="do" value="Spočítat"></td>
      </tr>
    </table>
  </form>
<?php echo $out; ?>
</body>
</html>
Editováno 7.11.2022 15:41
 
Nahoru Odpovědět
7.11.2022 15:39
Avatar
Tereza Rezková:7.11.2022 15:54

No potřebovala bych prostě místo match pomocí swtich. Takže místo prostě $vysledek = match potřebuji

switch ($i) {
    case 0:
        echo "i equals 0";
        break;
    case 1:
        echo "i equals 1";
        break;
    case 2:
        echo "i equals 2";
        break;
 
Nahoru Odpovědět
7.11.2022 15:54
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:7.11.2022 18:02

Aha. No, ta formulace je dost nestastna. Zkousela jsi manual? php.net/match. Hned druhy priklad?
https://www.php.net/…es.match.php

Example #2 Basic match usage

<?php
$food = 'cake';

$return_value = match ($food) {
    'apple' => 'This food is an apple',
    'bar' => 'This food is a bar',
    'cake' => 'This food is a cake',
};

var_dump($return_value);
?>

No potřebovala bych prostě místo match pomocí swtich.
No potřebovala bych, aby místo "match" bylo "switch".
Coz je prave presne naopak, nez to potrebujes, protoze switch tam mas. No, proste je to divne.
Kazdopadne, match je pomalejsi ne switch nebo pole a isset.

verze s polem by mohla vypadat takto:
$key = 'cake';
$list = array (
'apple' => 'This food is an apple',
    'bar' => 'This food is a bar',
    'cake' => 'This food is a cake'
);
if (isset($list[$key]) {...}
 
Nahoru Odpovědět
7.11.2022 18:02
Avatar
Tereza Rezková:7.11.2022 19:52

Ok, zkoušela jsem to dohledat. Zkusím to nějak napsat. Jen si moc nejsem jistá ale tak snad :D

 
Nahoru Odpovědět
7.11.2022 19:52
Avatar
Odpovídá na Peter Mlich
Tereza Rezková:7.11.2022 20:02

jo ono to má být totiž naopak, jsem tupá

 
Nahoru Odpovědět
7.11.2022 20:02
Avatar
Tereza Rezková:8.11.2022 13:33
      if(count($chyby) == 0){
          $vysledek = null;
          match($vysledek){
               '+' => print $prvniHodnota + $druhaHodnota;
                  break;

               '-' =>print $prvniHodnota - $druhaHodnota;
                  break;

               '*' => print $prvniHodnota * $druhaHodnota;
                  break;

               '/' => print $prvniHodnota / $druhaHodnota;
                  break;
          }

zkoušela jsem toto ale nefunguje mi to
 
Nahoru Odpovědět
8.11.2022 13:33
Avatar
Odpovídá na Peter Mlich
Tereza Rezková:8.11.2022 14:24

omlouvám se, bylo to naopak.
Zkusila jsem to přepsat takto:

if(count($chyby) == 0){
    $vysledek = null;
    match($vysledek){
         '+' => print $prvniHodnota + $druhaHodnota;
            break;

         '-' =>print $prvniHodnota - $druhaHodnota;
            break;

         '*' => print $prvniHodnota * $druhaHodnota;
            break;

         '/' => print $prvniHodnota / $druhaHodnota;
            break;
    }

ale pořád mi to nějak nefunguje.

 
Nahoru Odpovědět
8.11.2022 14:24
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:9.11.2022 9:32

Match ma preci uplne jinou konstrukci kodu nez ten switch. Kdyz to napises jinak nez je v dokumentaci, tak je pravdepodobne, ze ti to nepojede a navic zacne vypisovat chybove hlasky (pokud mas zaple error_reporting, php.net/error_reporting)
Mozna by bylo dobre cely ten tvuj kod zakomentovat a pod nej zkopirovat ten kod z dokumentace a postupne upravovat.

<?php
/*
    $vysledek = null;
    match($vysledek){ // proc je tu vysledek? vysledek preci v predchozim radku nastavujes null
// a kde mas tedy nejaky string, ze kterym bude ta funkce pracovat?
         '+' => print $prvniHodnota + $druhaHodnota; // proc je tu print? proc je na konci strednik?
            break; // proc je tu break?

         '-' =>print $prvniHodnota - $druhaHodnota;
            break;

         '*' => print $prvniHodnota * $druhaHodnota;
            break;

         '/' => print $prvniHodnota / $druhaHodnota;
            break;

*/

$food = 'cake';

$return_value = match ($food) {
    'apple' => 'This food is an apple',
    'bar' => 'This food is a bar',
    'cake' => 'This food is a cake',
};

var_dump($return_value);
?>
 
Nahoru Odpovědět
9.11.2022 9:32
Avatar
Odpovídá na Peter Mlich
Tereza Rezková:9.11.2022 9:50

No dobře a co tedy takto ?

 if(count($chyby) == 0){
     $vysledek = null;
     $operace = match($operace) {
         $prvniHodnota + $druhaHodnota => '+',

             $prvniHodnota - $druhaHodnota => '-',


             $prvniHodnota * $druhaHodnota  => '*',


             $prvniHodnota / $druhaHodnota =>  '/' $prvniHodnota / $druhaHodnota,

     };

var_dump ($operace)
 
Nahoru Odpovědět
9.11.2022 9:50
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:9.11.2022 14:23

A to ti funguje nebo se mne ptas? Jestli se mne ptas, tak postup, jak to delam ja, jsem ti rekl. Zkopiruji php kod z dokumentace. Kdyz dela, co dokumentace tvrdi, tak ho zkusim upravit. Nejdriv treba jeden radek. Klidne si udelam spesl maly pokusny php kod bokem.

1.

     $operace = '*';
     $prvniHodnota  = 7;
     $druhaHodnota  = 5;

//cast tveho kodu
     $operace = match($operace) {
         $prvniHodnota + $druhaHodnota => '+',

             $prvniHodnota - $druhaHodnota => '-',


             $prvniHodnota * $druhaHodnota  => '*',


             $prvniHodnota / $druhaHodnota =>  '/' $prvniHodnota / $druhaHodnota,

     };

var_dump ($operace); // a tady ocekavam ted 35 a misto toho to vypise co?

2. Takze, postup je takovy, ze si vemes kod z dokumentace, ulozis si to do nejakeho souboru, treba test1.php, spustis a podivas se, zda to vypise to, co v dokumentaci

<?php
$food = 'cake';

$return_value = match ($food) {
    'apple' => 'This food is an apple',
    'bar' => 'This food is a bar',
    'cake' => 'This food is a cake',
};

var_dump($return_value); // tady to vypise co? // podle dokumentace: 'This food is a cake',
?>

Takze, pokud ti to vypsalo 'This food is a cake', tak udelas malou zmenu...

<?php
//$food = 'cake'; // vsechny cake nahradim *
$food = '*';

$return_value = match ($food) {
    'apple' => 'This food is an apple',
    'bar' => 'This food is a bar',
//    'cake' => 'This food is a cake',
    '*' => 'This food is a *',
};

var_dump($return_value); // a ted to vypise co? 'This food is a *',
?>

Takze dokazes dat mu na vstupni data *, match na * reaguje a vypise textovou hlasku
Tak udelas dalsi malou zmenu... Ale, nez to udelas, kazdou funkcni verzi si uloz nekam stranou, abys ji mohla pouzit, kdyz neco opravis spatne. Treba si vytvor test2.php a zkopiruj do nej kod.
Takze, ta zmena...

<?php
//$food = 'cake';
//$food = '*'; // vsechny $ food nahradim $operace
$operace = '*';

$return_value = match ($operace) {
    'apple' => 'This food is an apple',
    'bar' => 'This food is a bar',
  //  'cake' => 'This food is a cake',
    '*' => 'This food is a *',
};

var_dump($return_value); // a ted to vypise co? 'This food is a *',
?>

No, a kdyz srovnas tvuj kod a muj kod, tak ti je jasne, ze tve upravy jsou nesmyslne. Ze jsi volila tvurci cinnost misto a pritom to staci takto jednoduse postupne prepisovat a po kazde zmene vyzkouset...

A az ti to bude fungovat, tak si to prekopirujes z test1 do programu. Snad se ti to podari.

Muzu ti napsat hotovy kod, ale je dobre si osvojit postup jeho tvorby. Ja treba funkci match v zivote zatim nepouzil, pac driv neexistovala, asi. Ale asi ji pouziji priste. filter_input jsem take neznal. Asi bych pro obe mel vyuziti, se uvidi, az priste neco budu tvorit.

Editováno 9.11.2022 14:25
 
Nahoru Odpovědět
9.11.2022 14:23
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:10.11.2022 7:27

Takhle, dalo by se rici, ze muj zpusob upravy, zamena textu, vytvoril malinko (zcela jiny :) ) jiny obsah nez je tvuj kod pro nasobeni :)

         $prvniHodnota * $druhaHodnota  => '*', // tvuj

'*' => 'This food is a *', // muj
 
Nahoru Odpovědět
10.11.2022 7:27
Avatar
Odpovídá na Peter Mlich
Tereza Rezková:10.11.2022 11:53

Díky moc za rady.

<?php
$food = '*';

$return_value = match ($food) {
    $prvniHodnota - $druhaHodnota  => '-',
    $prvniHodnota + $druhaHodnota  => '+',
    $prvniHodnota * $druhaHodnota  => '*',
    $prvniHodnota / $druhaHodnota  => '/',
};

var_dump($return_value); // tady to vypise co? // podle dokumentace: 'This food is a cake',
?>

Takhle mi to funguje konečně XD

 
Nahoru Odpovědět
10.11.2022 11:53
Avatar
kaskader202
Člen
Avatar
Odpovídá na Tereza Rezková
kaskader202:18.12.2022 17:34

Tohle ti nemůže fungovat.
Jak funguje match ?
Má podobnou konstrukci jako Switch. Takže to co do něj vstupuje hledá na levé straně (před =>) a když najde tak provede to co je na pravé straně (za =>). Takže chování je podobné jako má switch.

Takže pokud chceš dělat kalkulačku tak by to mělo vypadat nějak takto:

<?php
        $operace = '+';
        $prvniHodnota = 1;
        $druhaHodnota = 5;

        $result = match ($operace) {
            '-' => $prvniHodnota - $druhaHodnota,
            '+' => $prvniHodnota + $druhaHodnota,
            '*' => $prvniHodnota * $druhaHodnota,
            '/' => $prvniHodnota / $druhaHodnota,
            default => throw new \LogicException("Neznámá operace: {$operace}")
        };
        echo "Výsledek operace {$operace} mezi čísly {$prvniHodnota} a {$druhaHodnota} je {$result}. Tedy {$prvniHodnota} {$operace} {$druhaHodnota} = {$result}";

Ještě by to chtělo vyřešit jak zabránit dělení nulou :)

 
Nahoru Odpovědět
18.12.2022 17:34
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.