Php 如何管理组合框一起工作?

Php 如何管理组合框一起工作?,php,algorithm,Php,Algorithm,我有两个组合框。一种是“管理员”、“城市”、“剧院”,另一种是每日和每周。如果用户选择第一个项目和第二个项目中的一个,则显示每日操作。如果用户在第一个项目中选择一个项目,在第二个项目中不选择任何内容,则显示每日和每周操作。若用户并没有在第一个选项中选择任何内容,在第二个选项中并没有选择任何内容,那个么它会打开所有的操作。 因此,我认为有2^3个if条件。有没有办法减少这种情况?我使用的是PHP语言,但我认为所有语言的核心算法都是一样的 以下是我迄今为止在三种情况下所做的工作(如果是管理、每日和

我有两个组合框。一种是“管理员”、“城市”、“剧院”,另一种是每日和每周。如果用户选择第一个项目和第二个项目中的一个,则显示每日操作。如果用户在第一个项目中选择一个项目,在第二个项目中不选择任何内容,则显示每日和每周操作。若用户并没有在第一个选项中选择任何内容,在第二个选项中并没有选择任何内容,那个么它会打开所有的操作。 因此,我认为有2^3个if条件。有没有办法减少这种情况?我使用的是PHP语言,但我认为所有语言的核心算法都是一样的

以下是我迄今为止在三种情况下所做的工作(如果是管理、每日和每周):

<?php
 if(strlen($_POST['attribute'])>0)
 {
     echo "For admin: ";
     echo "</br>";
     //If admin
     if($_POST['attribute'] == 'Admin'){
     //If daily
     if($_POST['date'] == 'Daily'){
         echo "The only feature to show update is making a user admin\n";
         echo "</br>";
         $fh = fopen('back-up/makeadmin.txt','r');
         $foo = true;
         while ($line = fgets($fh)) {
             if($foo){
                 //Current time
                 $now = new DateTimeImmutable();
                 //One week ago
                 $oneDayAgo = $now->sub(new DateInterval('P1D'));
                 echo "</br>";
                 echo "</br>";
                 $date = DateTime::createFromFormat('m/d/Y h:i:s a+', $line);
                 //Here you can compare your dates like any other variables
                 if ($date > $oneDayAgo) {
                     /* Nothing echo "Current date is less than 1 week old"; 
                      Break;
                      */
                     break;
                 }
                 if ($date < $oneDayAgo) {
                     echo "$line";
                 }
                 var_dump($line);

             }
             $foo = (!$foo);
         }
         fclose($fh);
     }
     else { /*if($_POST['date'] == 'Weekly'){*/
         echo "The only feature to show update is making a user admin\n";
         echo "</br>";
         $fh = fopen('back-up/makeadmin.txt','r');
         $foo = true;
         while ($line = fgets($fh)) {
             if($foo){
                 //Current time
                 $now = new DateTimeImmutable();
                 //One week ago
                 $oneWeekAgo = $now->sub(new DateInterval('P1W'));
                 echo "</br>";
                 echo "</br>";
                 $date = DateTime::createFromFormat('m/d/Y h:i:s a+', $line);
                 //Here you can compare your dates like any other variables
                 if ($date > $oneWeekAgo) {
                     /* Nothing echo "Current date is less than 1 week old";
                      Break;
                      */
                 }
                 if ($date < $oneWeekAgo) {
                     echo "Current date is more than 1 week old";
                 }
                 var_dump($line);

             }
             $foo = (!$foo);
         }
         fclose($fh);
     }
//If not daily
else
{
    echo "weekly";
}
}
}
else
{
    echo "Not admin";
}
?>

我不熟悉PHP,但如果您的代码中有大量硬编码的
if
语句,这显然表明您需要更好的数据结构,或者可能需要任何数据结构

例如,您复制了一整段代码,其中第一段代码使用的是
$oneDayAgo
,第二段代码使用的是
$oneWeekAgo?
。根据第二个列表框的值,您可以很容易地将其转换为一个变量
,该变量的时间跨度为七天或一天

我不确定选择第一个框的目的是什么,可能是要读取的文件?您可能也能找到这三种情况的一些常见行为,并尝试用变量而不是代码来表达它们

您可能将相关数据存储为关联数组,其键为列表框的值:

$span = array("Daily" => "P1D", "Weekly" => "P1W");
作为下一步,您甚至可以使用数组的键(胖箭头左边的值)从PHP填充列表,并且可以轻松地将列表与时间跨度一起扩展,而无需添加任何新代码,只需添加新数据

最后,一个UI小问题:如果只有两个值,就不应该使用下拉列表框。使用一组相邻的两个单选按钮,用户将能够一眼看到这两个选项,而无需单击任何内容。(我也不认为这些是组合框,因为组合框允许通过手动输入值或从下拉列表中选择值来输入值。)