为什么php for循环停止了?

时间:2018-01-09 01:03:23

标签: php image for-loop image-gallery

我研究了这个,直到我的大脑受伤。我找不到为什么我的for循环停止循环的单一解释。

基本上,我有一个php脚本从目录中提取图像并将它们放在图像库和轮播的页面上。我有它设置,以便图像随机化。我只想要一定数量的图像,例如2。

我正在使用这个循环:

$amount = 2;
for($i = 0; $i < $amount; $i++){
}

虽然它主要提供总共2张图像,但有时它只提供1张图像,而且众所周知它根本不会提供图像。

我的问题是:为什么循环完全低于指定的数量?是的,我尝试使用3,但这给了我3张不想要的图像。

以下是完整的脚本:

 <?php
    // Set a variable for the directory
    $folderName = "Images/Gallery Images/thumbs/230x180/";
    // Open specified directory                 
    $folder = opendir($folderName);
    // Amount of images to count to
    $amount = 2;
    $loadedImages = array();

    // Read the directory
    while($file = readdir($folder)){
    // Check if file isn't a directory/sub-directory, we only want the images here...
        if(strpos($file, '.') !== 0){
            // Set image into an array
            $images[$i]= $file;
            // Move on to next image.
            $i++;
        }
    }
    // Count images upto predefined amount
    for($i = 0; $i < $amount; $i++){ 
    // Randomise the images, so we get completely random images each page load
        $random_img = rand(1,count($images)-1);

        // Check if array isn't empty
        // Otherwise it was sometimes getting empty values as an image
        if(empty($images[$random_img]) || !isset($images[$random_img])) {
            // If so, try another one
            $random_img = rand(1,count($images)-1);
        }
        // Check if image is already loaded
        if(in_array($images[$random_img], $loadedImages)){
            // If so, try another one
            $random_img = rand(1,count($images)-1);
        }
        // If all images passes the conditions write them into the page
        else {              
            // Echo out the image tag with the size attribute and src
            echo '<img src="'.$folderName.$images[$random_img].'" alt="Photo '.pathinfo($images[$random_img], PATHINFO_FILENAME).'">';
            // Add the image to the loadedImages array
            array_push($loadedImages,$images[$random_img]);
            // Unset each image in original array so we don't have double images
            unset($images[$random_img]);                                            
        }
    }
?>  

<小时/> 修改:供将来使用。

感谢ThànhChungBùi的answer,我修改,更改并改进了我的代码。这是我使用的完整脚本:

<?php
// Set a variable for the directory
$folderName = "Images/Gallery Images/";
// Open specified directory                 
$folder = opendir($folderName);
// Amount of images to count to
$amount = 2;
// Set an empty array for the images
$images = array();
// Set an empty array for the loaded images
$loadedImages = array();

// Read the directory and set all images into the image array
while (false !== ($file = readdir($folder))) {
    // Check if file is a regular file, we don't want directories or sub-directories, only images...
    if (is_file($folderName . $file) == true) {
        // Set image into the image array
        array_push($images, $file);
        // Move on to next image.
        $file++;
    }
}
closedir($folder);

// Count images upto predefined amount
for ($i = 0; $i < $amount; $i++) {
    // Randomise the images
    $random_img = array_rand($images);

    // If a random image has already been loaded using the loadedImages array or is empty...
    while (in_array($images[$random_img], $loadedImages) || empty($images[$random_img])) {
        // Pick another random image
        $random_img = array_rand($images);
    }
    // Get image width/height
    list($width, $height, $type, $attr) = getimagesize($folderName . $images[$random_img]);
    // Echo out the random image and set the width and data-width to be used later in JavaScript
    echo '<img src="' . $folderName . $images[$random_img] . '" alt="Photo ' . pathinfo($images[$random_img], PATHINFO_FILENAME) . '" style="width:' . $width . 'px;" data-width="' . $width . 'px;">';

    // Add the random image into the loadedImages array, so we can check against it
    array_push($loadedImages, $images[$random_img]);
}
?>

1 个答案:

答案 0 :(得分:1)

问题是你试图通过这个获得“未加载的图像”: $random_img = rand(1,count($images)-1);

你可能期望加载一个新图像,但没有保证新的随机图像是真正的新图像,所以循环跳过没有打印任何东西。

您可能需要添加一些检查新随机图像的内容,如下所示:

while(in_array($images[$random_img], $loadedImages)){
    $random_img = rand(1,count($images)-1);
}

用上面的代码替换for循环中的整个if else语句。

其他:

  • $random_img = rand(0,count($images)-1);
  • Read the directory部分,我没有看到设置$i的代码,$images[$i]= $file;也可以更简单:$images[]= $file;
  • 在这种情况下使用导致意外结果的unset函数(在else语句unset($images[$random_img]);中)。 unsetarray删除元素,但不删除重新索引数组。因此,您的代码会在某个时刻抛出Undefined offset

所以现在for循环中的代码可以是

$random_img = rand(0,count($images)-1);
while(in_array($images[$random_img], $loadedImages)){
    $random_img = rand(0,count($images)-1);
}
echo '...';
array_push($loadedImages,$images[$random_img]);