Vinnaren i pepparkakshustävlingen!
2024-04-17, 14:23
  #1
Medlem
insvepts avatar
Jag vill välja vilken if-sats som ska köras beroende på en $_POST:
Kod:
if($_POST['a'] == 1)
   if(
$datum "2020")

if(
$_POST['a'] == 2)
   if(
$datum "2022")

{
//Stora kodblocket som alltid ska köras, med en av if satserna ovan


Koden ovan är ju inte korrekt men jag hoppas ni förstår vart jag vill komma.
Jag vill alltså att resultatet av min kod ovan ska tolkas exempelvis såhär, om $_POST['a'] = 2:

Kod:
if($datum "2022")
{
//Stora kodblocket


Jag kan ju bara kopiera det stora kodblocket för varje fall av vad $_POST['a'] är, och sätta det under respektive sub-if-sats, men det blir jobbigt med massa duplicerad kod.

Så. Hur kör jag en specifik if-sats bereoende på vad $_POST['a'] är?
__________________
Senast redigerad av insvept 2024-04-17 kl. 14:30.
Citera
2024-04-17, 14:44
  #2
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av insvept
Jag vill välja vilken if-sats som ska köras beroende på en $_POST:
Kod:
if($_POST['a'] == 1)
   if(
$datum "2020")

if(
$_POST['a'] == 2)
   if(
$datum "2022")

{
//Stora kodblocket som alltid ska köras, med en av if satserna ovan


Koden ovan är ju inte korrekt men jag hoppas ni förstår vart jag vill komma.
Jag vill alltså att resultatet av min kod ovan ska tolkas exempelvis såhär, om $_POST['a'] = 2:

Kod:
if($datum "2022")
{
//Stora kodblocket


Jag kan ju bara kopiera det stora kodblocket för varje fall av vad $_POST['a'] är, och sätta det under respektive sub-if-sats, men det blir jobbigt med massa duplicerad kod.

Så. Hur kör jag en specifik if-sats bereoende på vad $_POST['a'] är?
Mja, du är inte supertydlig, men två förslag:

1. Switch-sats; eller

2. Lookup-table, t.e.x [1=>2020 ,2=> 2022] och sen:
Kod:
$lookUpTable = array(1=>2020 2=> 2022);

if (
$datum $lookUpTable[$_POST['a']])
{
  
// stora blocket

__________________
Senast redigerad av Enterprise 2024-04-17 kl. 14:50.
Citera
2024-04-17, 15:03
  #3
Medlem
insvepts avatar
Sub-if-satserna kan alltså vara annat än datum-exemplet.

De kan lika gärna vara:

om $_POST['a'] == 1:
Kod:
if($trigger 0.5 && $vader == "molnigt"

om $_POST['a'] == 2:
Kod:
if($volume 12

Men vilken if-sats som ska gälla (endast en av dom) ska styras av vad $_POST['a'] är.
Citera
2024-04-17, 15:17
  #4
Medlem
insvepts avatar
Här är ett annat sätt att exemplifiera vad jag vill få fram:

Kod:
if($_POST['a'] == 1)
   
$if_statement '$trigger > 0.5';

if(
$_POST['a'] == 2)
   
$if_statement '$vader == "molnigt"';

if(
$if_statement){
   
//Stora kodblocket

Citera
2024-04-17, 16:22
  #5
Medlem
PotatisHulkens avatar
Bygg du ett boolskt uttryck (som kan evalueras till sant eller falskt). Om uttrycken till vänster eller höger av 'eller'-operatorn (||) evalueras till sant evalueras hela uttrycket till sant.

Kod:
if ( ( $_POST['a'] == && $trigger 0.5 ) || ($POST['a'] == && $vader == 'molnigt')  ) {
  
// if-block


Eller så gör du en funktion av if-blocket och gör två olika if-ar.
Kod:
if ( $_POST['a'] == && $trigger 0.5 if_block();
else if ( 
$_POST['a'] == && $vader == 'molnigt' if_block(); 
Citera
2024-04-17, 16:55
  #6
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av insvept
Sub-if-satserna kan alltså vara annat än datum-exemplet.

De kan lika gärna vara:

om $_POST['a'] == 1:
Kod:
if($trigger 0.5 && $vader == "molnigt"

om $_POST['a'] == 2:
Kod:
if($volume 12

Men vilken if-sats som ska gälla (endast en av dom) ska styras av vad $_POST['a'] är.
Du kan också göra en lookup-table med funktioner där dina villkor finns.

Exempel:
Kod:
<?php
$conditions 
= [
    
'is_positive' => fn($x) => $x 0,
    
'is_negative' => fn($x) => $x 0,
    
'is_zero'     => fn($x) => $x === 0,
    
'is_even'     => fn($x) => $x == 0,
    
'is_odd'      => fn($x) => $x != 0,
];

function 
testCondition($conditionKey$value$conditions) {
    if (
array_key_exists($conditionKey$conditions)) {
        
$func $conditions[$conditionKey];
        return 
$func($value);
    } else {
        throw new 
Exception("Condition not found.");
    }


var_dumptestCondition('is_odd',3$conditions));
var_dumptestCondition($_POST['a'], 3$conditions));

Men om du har ganska få villkor som inte behöver ändras så är en Switch enklare.
__________________
Senast redigerad av Enterprise 2024-04-17 kl. 17:03.
Citera
2024-04-17, 18:25
  #7
Medlem
insvepts avatar
Citat:
Ursprungligen postat av PotatisHulken
Bygg du ett boolskt uttryck (som kan evalueras till sant eller falskt). Om uttrycken till vänster eller höger av 'eller'-operatorn (||) evalueras till sant evalueras hela uttrycket till sant.

Kod:
if ( ( $_POST['a'] == && $trigger 0.5 ) || ($POST['a'] == && $vader == 'molnigt')  ) {
  
// if-block


Eller så gör du en funktion av if-blocket och gör två olika if-ar.
Kod:
if ( $_POST['a'] == && $trigger 0.5 if_block();
else if ( 
$_POST['a'] == && $vader == 'molnigt' if_block(); 

Första lösningen med || gillade jag, litet och snyggt. Testat och funkar för mina behov just nu. En liten undran är bara hur jag gör om jag i framtiden behöver göra en || inom lilla if-satsen, såhär:

Kod:
if ( ( $_POST['a'] == && $trigger 0.5 ) || ($POST['a'] == && $vader == 'molnigt' || $vader == 'regnigt')  ) {
  
// if-block


Citat:
Ursprungligen postat av Enterprise
Du kan också göra en lookup-table med funktioner där dina villkor finns.

Exempel:
Kod:
<?php
$conditions 
= [
    
'is_positive' => fn($x) => $x 0,
    
'is_negative' => fn($x) => $x 0,
    
'is_zero'     => fn($x) => $x === 0,
    
'is_even'     => fn($x) => $x == 0,
    
'is_odd'      => fn($x) => $x != 0,
];

function 
testCondition($conditionKey$value$conditions) {
    if (
array_key_exists($conditionKey$conditions)) {
        
$func $conditions[$conditionKey];
        return 
$func($value);
    } else {
        throw new 
Exception("Condition not found.");
    }


var_dumptestCondition('is_odd',3$conditions));
var_dumptestCondition($_POST['a'], 3$conditions));

Men om du har ganska få villkor som inte behöver ändras så är en Switch enklare.

Tack för svaret. Jag kör på PotatisHulkens lösning till vidare. Den är tillräckligt simpel för att jag ska begripa den
Citera
2024-04-18, 07:44
  #8
Moderator
Protons avatar
Citat:
Ursprungligen postat av insvept
Här är ett annat sätt att exemplifiera vad jag vill få fram:

Kod:
if($_POST['a'] == 1)
   
$if_statement '$trigger > 0.5';

if(
$_POST['a'] == 2)
   
$if_statement '$vader == "molnigt"';

if(
$if_statement){
   
//Stora kodblocket

Den där kommer förmodligen inte riktigt göra det du tror, eftersom en sträng med längd större än 0 kommer behandlas som "truthy" av php, så predikatet kommer alltid vara true där.
Citera
2024-04-18, 10:57
  #9
Medlem
PotatisHulkens avatar
Citat:
Ursprungligen postat av insvept
...

Precis, men var noga med paranteserna för tydlighetens skull! Använd också gärna lämpliga radbrytningar, se följande;

Kod:
if ( ( $_POST['a'] == && $trigger 0.5 ) ||
     ( 
$_POST['a'] == && ($vader == 'molnigt' || $vader == 'regnigt' )) ) {
  
// if-block


Eftersom du kollar samma variabel här ($vader) kan du även göra såhär;
Kod:
if ( ( $_POST['a'] == && $trigger 0.5 ) ||
     ( 
$_POST['a'] == && in_array($vader, array('molnigt''regnigt')) ) ) {
  
// if-block

Citera
2024-04-18, 14:02
  #10
Medlem
insvepts avatar
Citat:
Ursprungligen postat av Proton
Den där kommer förmodligen inte riktigt göra det du tror, eftersom en sträng med längd större än 0 kommer behandlas som "truthy" av php, så predikatet kommer alltid vara true där.

Jo, jag vet att den koden blir fel, jag ville bara visa med det vad jag ville åstadkomma med "magisk kod" som ser ut att funka.

Citat:
Ursprungligen postat av PotatisHulken
Precis, men var noga med paranteserna för tydlighetens skull! Använd också gärna lämpliga radbrytningar, se följande;

Kod:
if ( ( $_POST['a'] == && $trigger 0.5 ) ||
     ( 
$_POST['a'] == && ($vader == 'molnigt' || $vader == 'regnigt' )) ) {
  
// if-block


Eftersom du kollar samma variabel här ($vader) kan du även göra såhär;
Kod:
if ( ( $_POST['a'] == && $trigger 0.5 ) ||
     ( 
$_POST['a'] == && in_array($vader, array('molnigt''regnigt')) ) ) {
  
// if-block


Kod:
&& ($vader == 'molnigt' || $vader == 'regnigt' 
Aha jag visste inte att man kunde gruppera ihop saker inom paranteser efter "&&" inom if-satser sådär för att mixtra med logiken.
Det gör saker och ting lättare. Och in_array-grejen var en ny grej för mig.
Tack!
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback