Php 如何清理此if/else语句?(重构)

Php 如何清理此if/else语句?(重构),php,if-statement,refactoring,Php,If Statement,Refactoring,我知道一定有更好的方法可以做到这一点,但每当我搜索“&&”时,我都没有得到足够好的结果 <?php if (empty($row[ContactName]) && empty($row[ContactEmail]) && empty($row[ContactPhone]) && empty($row[Website])){ echo "Not Provided"; } else{ ...do stuff... } ?> 谢谢 &l

我知道一定有更好的方法可以做到这一点,但每当我搜索“&&”时,我都没有得到足够好的结果

<?php
if (empty($row[ContactName]) && empty($row[ContactEmail]) && empty($row[ContactPhone]) && empty($row[Website])){
echo "Not Provided";
}
else{
...do stuff...
}
?>

谢谢

<?php
$i=1;
$ar=array('ContactName','ContactEmail','ContactPhone','Website')

foreach($ar as $a)
  if (empty($row[$a]))
    {
     $i=0;
     break;                      //to make code fast
    }
  if($i)         //do stuff
  else echo 'not provided';
?>
然后呢

 <?php
  $i=1;
  for($a=1;$a<5;$a++)
    if (empty($row['Col'.$a]))
    {
      $i=0;
      break;
    }
  if($i)//do stuff
  else echo 'Not Provided';
    ?>


但是,重命名列是不好的,因为它会使数据库变得不那么容易理解。

原始代码有什么问题

<?php
$flag = 1;
if (empty($row[ContactName])){
$flag = 0;
}
if (empty($row[ContactEmail])){
$flag = 0;
}
if (empty($row[ContactPhone])){
$flag = 0;
}
if (empty($row[Website])){
$flag = 0;
}

if($flag == 0){
echo "Not Provided";

}else{
//do stuff
}    


?>
<?php
if (empty($row[ContactName]) 
    && empty($row[ContactEmail]) 
    && empty($row[ContactPhone]) 
    && empty($row[Website]))
{
    echo "Not Provided";
} 
else{
 ...do stuff...
}
?>


在我看来,这是一段很好的代码…

如果紧凑性比可读性更重要的话,您可以将代码缩短为这样:)

您不能将数组_filter放入empty()中,否则会出现“致命错误:无法在写上下文中使用函数返回值”

1) 数组翻转正在将$required值转换为键
2) 数组_intersect_键丢弃在$required中未找到的任何$row键
3) 数组过滤器会丢弃任何空值


留下一个零长度数组,该数组为空。无需担心数组长度或循环

因为php函数有很多不一致性,所以最好使用库使其更一致

将此函数放入该库中:

function empty()
{
    foreach(func_get_args() as $arg) if (empty($arg)) return false;
    return true;
}
用法:

if (empty($row[ContactName], $row[ContactEmail], $row[ContactPhone], $row[Website])) {
      echo "Not Provided";
}

不要只是为了让代码看起来更好而玩数组之类的东西。 正如汤米指出的

<?php
if (empty($row[ContactName]) 
    && empty($row[ContactEmail]) 
    && empty($row[ContactPhone]) 
    && empty($row[Website]))
{
    echo "Not Provided";
} 
else{
 ...do stuff...
}
?>

这段代码很好,只需要像他指出的那样正确的格式。 制作阵列然后启动循环将降低性能

<?php
    $i=1;
    for($a=1;$a<5;$a++)
    if (empty($row['Col'.$a]))
    {
    $i=0;
    break;
    }
    if($i)//do stuff
    ?>

这可能看起来很小、很好且“专业”,但有更多的操作可以给出与简单if指令相同的结果。
并不是说它不能做得更快,我对php不太了解,只是要记住代码执行速度。

我认为从某种意义上讲,它可以用于四列,但我需要对照四十列进行检查。。。在这里,它开始变得非常长和累赘。@Fluffeh一行中的40个在技术上可能不太可读。但安基特的解决方案更适合这种情况。在这个主题上,我认为重构不仅仅包括缩进。。但没关系。啊,这个问题的目标是一个可伸缩的解决方案,这有点被忽略了。我想他只是觉得LONGFOR循环不可读,我不同意这一点。你在哪里递增
$I
?为什么不在数组索引中使用引号?在这种情况下,您的索引被视为常量。第一个数组已经是一个很好的解决方案了,但是一些缩进可以使它更具可读性+1如果需要验证所有键,甚至可以将其减少到1行:if(count(array_filter($row))==count($row))。。。
if (empty($row[ContactName], $row[ContactEmail], $row[ContactPhone], $row[Website])) {
      echo "Not Provided";
}
<?php
if (empty($row[ContactName]) 
    && empty($row[ContactEmail]) 
    && empty($row[ContactPhone]) 
    && empty($row[Website]))
{
    echo "Not Provided";
} 
else{
 ...do stuff...
}
?>
<?php
    $i=1;
    for($a=1;$a<5;$a++)
    if (empty($row['Col'.$a]))
    {
    $i=0;
    break;
    }
    if($i)//do stuff
    ?>