[英]PHP - How can I write this IF and ELSE statement cleaner and faster
我以前写的这段代码。 它检查外部服务器上是否有图像,如果存在,它将在列表中回显该图像。 我最多有13条记录要检查。 我认为这里最好使用数组,但不确定它们如何工作。
$a1="".$cdnurl."assets/".$pid."/1/medium.jpg";
$a2="".$cdnurl."assets/".$pid."/2/medium.jpg";
$a3="".$cdnurl."assets/".$pid."/3/medium.jpg";
$a4="".$cdnurl."assets/".$pid."/4/medium.jpg";
$a5="".$cdnurl."assets/".$pid."/5/medium.jpg";
$a6="".$cdnurl."assets/".$pid."/6/medium.jpg";
$a7="".$cdnurl."assets/".$pid."/7/medium.jpg";
$a8="".$cdnurl."assets/".$pid."/8/medium.jpg";
$a9="".$cdnurl."assets/".$pid."/9/medium.jpg";
$a10="".$cdnurl."assets/".$pid."/10/medium.jpg";
$a11="".$cdnurl."assets/".$pid."/11/medium.jpg";
$a12="".$cdnurl."assets/".$pid."/12/medium.jpg";
$a13="".$cdnurl."assets/".$pid."/13/medium.jpg";
if(@fopen($a1,"r")){
echo '<li class="royalSlide"><img src="'.$a1.'" alt="" /></li>';
}
if(@fopen($a2,"r")){echo '<li class="royalSlide"><img src="'.$a2.'" alt="" /></li>';
}
if(@fopen($a3,"r")){echo '<li class="royalSlide"><img src="'.$a3.'" alt="" /></li>';
}
if(@fopen($a4,"r")){echo '<li class="royalSlide"><img src="'.$a4.'" alt="" /></li>';
}
if(@fopen($a5,"r")){echo '<li class="royalSlide"><img src="'.$a5.'" alt="" /></li>';
}
if(@fopen($a6,"r")){echo '<li class="royalSlide"><img src="'.$a6.'" alt="" /></li>';
}
if(@fopen($a7,"r")){echo '<li class="royalSlide"><img src="'.$a7.'" alt="" /></li>';
}
if(@fopen($a8,"r")){echo '<li class="royalSlide"><img src="'.$a8.'" alt="" /></li>';
}
if(@fopen($a9,"r")){echo '<li class="royalSlide"><img src="'.$a9.'" alt="" /></li>';
}
if(@fopen($a10,"r")){echo '<li class="royalSlide"><img src="'.$a10.'" alt="" /></li>';
}
if(@fopen($a11,"r")){echo '<li class="royalSlide"><img src="'.$a11.'" alt="" /></li>';
}
if(@fopen($a12,"r")){echo '<li class="royalSlide"><img src="'.$a12.'" alt="" /></li>';
}
for ($i = 1; $i < 14; $i++)
{
$elem = $cdnurl . "assets/" . $pid . "/$i/medium.jpg";
if(is_readable($elem))
{
echo '<li class="royalSlide"><img src="'.$elem.'" alt="" /></li>';
}
}
使用foreach循环不会使其更快,但会使它看起来更干净。
您的设计是错误的,您不必在每次页面加载时都检查资产是否存在。 使脚本生成HTML并加载该HTML,而不是每次都连接到CDN。
您现在要在CDN上增加两倍的负载。 如果在缺少图像时需要隐藏某些<li>
元素,请在图像加载失败时使用Javascript删除该元素。
假设使用类似“ ... number ...”之类的URL的代码:
<?php
foreach (range(0, 13) as $number) {
$url = $cdnurl . "assets/$pid/$number/medium.jpg";
echo '<li class="royalSlide">
<img src="' . $url . '" onerror="parentNode.parentNode.removeChild(parentNode)" alt="" />
</li>';
}
?>
此代码是您问题中代码的增强:
<?php
foreach (range(0, 13) as $number) {
$url = $cdnurl . "assets/$pid/$number/medium.jpg";
// skip URLs which cannot be found
if (!file_exists($url)) continue;
echo '<li class="royalSlide">
<img src="' . $url . '" alt="" />
</li>';
}
?>
是的,您可以使用列表。
一个好主意是使用for创建它:
$a = array();
for($i = 0; î < 14; ++$i)
{
$a[] = $cdnurl."assets/".$pid."/".$i."/medium.jpg";
}
然后,您可以阅读它:
foreach($a as $tmpA)
{
...
}
在其中,您必须测试这是否是服务器上的映像,并显示它。 但是您不应该使用fopen。 对于大量的resae。
起初,您使用@是因为您不想对此进行任何Wrning,如果您有警告说您正在做绞拧,而php会尝试为您更改它。 拥有清晰的代码是您的工作。 但更重要的是,fopen基于打开的文件创建资源。 然后在此页面中创建14个资源! 而且由于您永远不会关闭它们,它们将在页面末尾销毁。
有一个PHP函数是:file_exitsts。 泰铢最适合您:
foreach($a as $tmpA)
{
if (file_exists($filename))
{
echo '<li class="royalSlide"><img src="'.$tmpA.'" alt="" /></li>';
}
}
尽管可以使此代码更简洁,但不能使其更快。 从外部服务器检查图像本身就是一个糟糕的主意,而且总是很慢。 只是因为它是外部服务器。
我想知道是否有任何理由检查每个图像是否存在。 他们变化如此快吗?
for($i=1;i<=13;i++){
$item =$cdnurl.'assets/'.$pid.'/'.$i.'/'.medium.jpg;
echo (@fopen($item,'r')?'<li class="royalSlide"><img src="'.$item.'" alt="" /></li>':'');
}
假设文件确实是按数字命名的,将可以解决问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.