簡體   English   中英

PHP和嵌套條件

[英]PHP & nested conditions

在PHP中(甚至是其他語言,但在當前情況下,這在PHP中更多),有時我常常不得不編寫一些較長的條件,例如以下示例:

我有一個包含許多條件的代碼,我想根據某些條件顯示不同的結果。

  • 如果某物是紅色而另一物是紅色,則打印X,
  • 如果某物是紅色但另一物是黑色,則打印Y
  • 如果某物為紅色而另一物為紅色,但第三物為藍色,則打印X
  • 等等

有沒有一種方法可以通過使用某種數據結構/配置數組/矩陣/任何方式來正確處理此問題? 也就是說,以某種配置數組或其他形式正確存儲這些“條件”和“結果”?

而不是像這樣一個很小的示例,但是必須編寫一個更大的規模的代碼,而不必編寫嵌套的條件來支持以后

if (preg_match(/something/, $string) {
  $result = 'GREEN';
} elseif (preg_match(/something/, $string) {
  $result = 'RED';
} else {
  if (something else) {
    $result = 'GREEN';
  } else {
    if (something OR something) {
       $result = 'AMBER';
    } else {
       $result = 'GREEN';
    }
  }
}

還是處理此問題的唯一方法? 也許一個

if (something and something or something) {

} elseif (something and something and something) {

} elseif (something and something or something and something) {

} etc

謝謝您的幫助

我正在編寫一個應根據許多不同數據(該數據的其他屬性)針對某些數據顯示不同“狀態”的應用程序,並且我希望避免代碼不可讀

出於以下答案的目的,我假設您正在編碼OO PHP

一個變量

當我有一個確定結果的變量時,如果該變量是布爾值還是接近於布爾值(意味着它只能是一個或兩個不同的值),那就像您一樣使用if()語句。 如果變量可以是各種(已知)值(例如您的顏色示例),則可以使用switch()函數。

兩個或多個變量

如果我有兩個確定結果的變量,例如顏色和大小,則首先使用switch() ,然后對每個開關使用包含另一個switch()

它可能更冗長,但是從長遠來看,要跟蹤它要容易得多。 以下是該邏輯的簡化示例。

switch ($colour) {
case 'red':
    red_handler($size);
    break;

case 'green':
    green_handler($size);
    break;

case 'blue':
    blue_handler($size);
    break;
}

/** We already know the first variable value is red */
function red_handler($size)
{
    switch ($size) {
    case 'small':
        echo "my fruit is a cherry";
        break;

    case 'medium':
        echo "my fruit is an apple";
        break;

    case 'large':
        echo "my fruit is a watermelon";
        break;
    }
}

您可以使用嵌套數組:

$conditions = [
    '/something1/' => [
        '/something2/' => "X"
    ],
    'thing3' => [
        '/thing3/' => 'Y',
        '/thing4/' => 'Z'
    ]
];
$matched = false;
foreach ($conditions as $key1 => $val1) {
    if (preg_match($key1, $string)) {
        if (is_array($val1)) {
            foreach ($val1 as $key2 => $val2) {
                if (preg_match($key2, $string)) {
                    $result = $val2;
                    $matched = true;
                    break;
                }
            }
        } else {
            $result = $val1;
            $matched = true;
        }
    }
    if ($matched) {
        break;
    }
}
if (!$matched) {
    $result = 'default';
}

要允許任意級別的嵌套,您可以將其轉換為遞歸函數。

與@dearsina相似,我傾向於將其分離為此類事情的功能,例如,如果您知道在很多情況下它可以返回相同的值,例如:

if(isGreen($string)) return 'GREEN';
else if (isRed($string)) return 'RED';

function isGreen($string) {
    if(cond1)return true;
    if(cond2 && cond3)return true;
    if(cond4 || cond 5)return true;
    return false;
}

function isRed($string) {
    if(cond6)return true;
    if(cond1 && cond7)return true;
    if(cond2 || cond 8)return true;
    return false;
}

我們有時會使用您建議的樣式...

if (something and something or something) {

} else if (something and something and something) {

但是您很快就會遇到同樣的可讀性和維護問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM