Diskuze: záměna match za switch
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.


- pouzivej pro psani kodu tlacitko editoru vlozit kod,
</>
- 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>
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;
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]) {...}
Ok, zkoušela jsem to dohledat. Zkusím to nějak napsat. Jen si moc nejsem
jistá ale tak snad
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
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.
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);
?>
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)
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.
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
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
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
Zobrazeno 14 zpráv z 14.