PHP获取文件夹中的图像返回相同的图像


PHP get images in folder returns same image

我正在创建一个joomla模块,它可以拉入一篇文章,然后从文件夹中为其分配图像(没有特定的顺序)。

但是它一直返回相同的图像:/…其他一切都很完美,我只需要它为每篇文章从文件夹中抓取不同的图像。

下面是mod_slider.php(只包括基本部分):

$a = explode(",", $params->get('id'));
foreach ($a as $k => $val) {
    $args = $val;
    $item[] = ModArticleSlider::getArticles($args,$params);
}

和helper.php(包括整个类):

class ModArticleSlider {
    public static function getArticles($args,$params){
        $db = JFactory::getDBO();
        $id = $args;
        if($id > 0){
            $query  = "select * ";
            $query .= "FROM #__content  WHERE id =".$id." AND state=1 " ;
            //echo $query;
            $db->setQuery($query);
            $item = $db->loadObject();
        }

        $folder = $params->get('folder');
        if(JString::strpos($folder, JURI::base()) === 0)
        {
            $folder = str_replace(JURI::base(), '', $folder);
        }
        if(JString::strpos($folder, JPATH_SITE) === 0)
        {
            $folder = str_replace(JPATH_BASE, '', $folder);
        }
        $folder = str_replace('''', '/', $folder);
        $dir = JPATH_BASE.'/'.$folder;
        $files = array();
        if(is_dir($dir))
        {
            if($handle = opendir($dir))
            {
                while(($file = readdir($handle)) !== false)
                {
                    if($file != '.' AND $file != '..' AND $file != 'index.html')
                    {
                        $files[] = $file;
                    }
                }
            }
            closedir($handle);
            $types = array_map('trim', explode(',', $params->get('type')));
            $images = array();
            foreach($files as $img){
                if(!is_dir($dir.'/'.$img))
                {
                    foreach($types as $type)
                    {
                        $muster = '@'.$type.'$@i';
                        if(preg_match($muster, $img))
                        {
                            $item->name = $img;
                            $item->folder = str_replace('''', '/', $folder);
                        }
                    }
                }
            }
        }
        return $item;
    }
}

,然后是index.php(只包括要点):

<?php foreach ($item as $items):?>
<img src="<?php echo $items->folder.'/'.$items->name ?>" />
<?php endforeach; ?>

看起来您实际上并没有选择一个随机图像。我要看的代码是这一部分:

        $types = array_map('trim', explode(',', $params->get('type')));
        $images = array();
        foreach($files as $img){
            if(!is_dir($dir.'/'.$img))
            {
                foreach($types as $type)
                {
                    $muster = '@'.$type.'$@i';
                    if(preg_match($muster, $img))
                    {
                        $item->name = $img;
                        $item->folder = str_replace('''', '/', $folder);
                    }
                }
            }
        }

循环遍历所有文件,但如果匹配,则只是将它们相互赋值。每次覆盖$item->name$item->folder。我也不知道你在哪里随机化文件列表,所以你不能指望得到一个随机的图像。(我假设你可能会使用$images来实现随机化或获得所有匹配,所以你可能会删除它。)我会在$files上添加shuffle以随机化文件列表,然后在获得第一个匹配后中断循环,以避免不必要地处理整个列表:

        $types = array_map('trim', explode(',', $params->get('type')));
        shuffle($files);
        foreach($files as $img){
            if(!is_dir($dir.'/'.$img))
            {
                foreach($types as $type)
                {
                    $muster = '@'.$type.'$@i';
                    if(preg_match($muster, $img))
                    {
                        $item->name = $img;
                        $item->folder = str_replace('''', '/', $folder);
                        break 2;
                    }
                }
            }
        }