如果一个Foreach失败你可以做一个别的声明吗?

时间:2015-03-02 12:16:03

标签: php

我有一个Instagram图像检索器的代码,它运行良好,但可能会非常糟糕。

<table border="0" width="90%" cellspacing="0" cellpadding="0">
                                        <tr>
                                            <td>
<?php
        function fetch_data($url){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 20);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }

    $access_token = "xxx.xxx.xxx";
    $display_size = "standard_resolution"; 

    $number_of_images = 7;

    $result = fetch_data("https://api.instagram.com/v1/users/[user]/media/recent/?count={$number_of_images}&access_token={$access_token}");
    $result = json_decode($result);

    $images = array();
    foreach($result->data as $photo)
{
    $images[] = array(
        'url'  => $photo->images->{$display_size}->url,
        'link' => $photo->link,
    );
}
?>
<a href="<?php echo $images[0]['link']; ?>" target="new"><img src="<?php echo $images[0]['url']; ?>" border="0" height="200" width="200" /></td>
                                        </tr>
                                        <tr>
                                            <td><a href="<?php echo $images[1]['link']; ?>" target="new"><img src="<?php echo $images[1]['url']; ?>" border="0" height="200" width="200" /></a></td>
                                        </tr>
                                    </table>
                                    </td>
                                    <td><a href="<?php echo $images[2]['link']; ?>" target="new"><img src="<?php echo $images[2]['url']; ?>" border="0" height="400" width="400" /></a></td>
                                    <td valign=top>
                                    <table border="0" width="100%" cellspacing="0" cellpadding="0">
                                        <tr>
                                            <td><a href="<?php echo $images[3]['link']; ?>" target="new"><img src="<?php echo $images[3]['url']; ?>" border="0" height="200" width="200" /></a></td>
                                        </tr>
                                        <tr>
                                            <td><a href="<?php echo $images[4]['link']; ?>" target="new"><img src="<?php echo $images[4]['url']; ?>" border="0" height="200" width="200" /></a></td>
                                        </tr>
                                    </table>
                                    </td>
                                    <td valign=top>
                                    <table border="0" width="100%" cellspacing="0" cellpadding="0">
                                        <tr>
                                            <td> <a href="<?php echo $images[5]['link']; ?>" target="new"><img src="<?php echo $images[5]['url']; ?>" border="0" height="200" width="200" /></a></td>
                                        </tr>
                                        <tr>
                                            <td><a href="<?php echo $images[6]['link']; ?>" target="new"><img src="<?php echo $images[6]['url']; ?>" border="0" height="200" width="200" /></a></td>
                                        </tr>
                                    </table>
                                    </td>
                                </tr>
                            </table>
                            </td>
                        </tr>
                    </table>
                    </td>
                </tr>
            </table>
            </td>
        </tr>
    </table>

因此,当该脚本死亡时,它表示它在第57行失败,第57行

 foreach($result->data as $photo)

无论如何都要去,如果这行失败然后显示所以错误信息不会使网站看起来凌乱吗?

2 个答案:

答案 0 :(得分:0)

foreach仅适用于arrayobjects,其他所有内容都会生成错误
它不会引发异常:try/catch阻止它将无效。

在你的情况下,你必须这样做:

if (is_array  ($result->data) || 
    is_object ($result->data)) {

foreach ($result->data as $photo) {
    $images[] = array ( 'url'  => $photo->images->{$display_size}->url,
                        'link' => $photo->link); 
    // Note that i have removed a comma after $photo->link
}
}else {
    // can not loop ....
}

答案 1 :(得分:0)

您可以使用Traversable界面

  

Traversable接口:用于检测类是否可以使用foreach遍历的接口。

所以在你的情况下,在foreach之前:

if ($result->data instanceof Traversable) {
    // can use foreach
}