Php foreach内部foreach问题

Php foreach内部foreach问题,php,foreach,scandir,Php,Foreach,Scandir,我有两个目录:一个有图像,另一个有ZIP文件。 两个目录中的文件名称相同,例如:1.zip、1.png 我像这样扫描了每个文件夹: $images = 'screenshots/'; $scanned_images = array_diff(scandir($images), array('..', '.')); $zips = 'download/'; $scanned_zips = array_diff(scandir($zips), array('..', '.')); 然后: f

我有两个目录:一个有图像,另一个有ZIP文件。 两个目录中的文件名称相同,例如:1.zip、1.png

我像这样扫描了每个文件夹:

$images    = 'screenshots/';
$scanned_images = array_diff(scandir($images), array('..', '.'));
$zips = 'download/';
$scanned_zips = array_diff(scandir($zips), array('..', '.'));
然后:

foreach ($scanned_images as $value)
{
echo '<div class="portfolioItem">';
echo '<a href="screenshots/'.$value.'" class="zoom img" title="'.$value.'"      rel="portfolio">';
echo '<img src="screenshots/'.$value.'" class="portfolio-image" alt="'.$value.'" /> </a>';
foreach ($scanned_zips as $val)
{
echo '<div class="portfolioDescription">';
echo'<h4>Download:'.$val.'</h4>';
echo'<p><a href="download/'.$val.'">Click here to download</a></p>';
echo'</div></div>';
}
}
foreach($value形式的扫描图像)
{
回声';
回声';
foreach($val)
{
回声';
echo'Download:'.$val.';
回声“

”; 回声'; } }
这是行不通的。第一个目录中的每个图像的描述中将包含第二个目录的整个zip文件

我还尝试将两个数组组合成一个数组,并使用
foreach($result as list($a,$b))
但是
as list
总是给出错误


如何克服这一问题?

一种方法是按名称对文件进行散列,不带扩展名。然后使用相同的键检索图像数据和zip数据。例如:

$scanned_images = array('1.png', '2.png');
$scanned_zips = array('1.zip', '2.zip');

//Should be like that after hashing
$scanned_images = array('1' => '1.png', '2' => '2.png');
$scanned_zips = array('1' => '1.zip', '2' => '2.zip');
因此,代码可以是:

function get_file_name($path) {
    $name = basename($path);
    $name = substr($name, 0, strrpos($name, '.'));
    return $name;
}

function hash_files_by_name($items) {
    $hashed = array();
    foreach($items as $item) {
        $name = get_file_name($item);
        $hashed[$name] = $item;
    }

    return $hashed;
}


$scanned_images = array('1.png', '2.png'); // get images directory filesnames
$scanned_zips = array('1.zip', '2.zip'); // get zips directory filenames.

$imgs = hash_files_by_name($scanned_images);
$zips = hash_files_by_name($scanned_zips);

foreach ($imgs as $key=>$value)
{
    echo '<div class="portfolioItem">';
    echo '<a href="screenshots/'.$value.'" class="zoom img" title="'.$value.'"      rel="portfolio">';
    echo '<img src="screenshots/'.$value.'" class="portfolio-image" alt="'.$value.'" /> </a>';
    if(isset($zips[$key])) {
        echo '<div class="portfolioDescription">';
        echo'<h4>Download:'.$zips[$key].'</h4>';
        echo'<p><a href="download/'.$zips[$key].'">Click here to download</a></p>';
        echo'</div></div>';
    }
}
函数获取文件名($path){
$name=basename($path);
$name=substr($name,0,strrpos($name,'.');
返回$name;
}
函数按文件名($items)散列文件{
$hashed=array();
foreach($items作为$item){
$name=获取文件名($item);
$hashed[$name]=$item;
}
返回$hash;
}
$scanned_images=array('1.png','2.png');//获取图像目录文件名
$scanned_zips=array('1.zip','2.zip');//获取zips目录文件名。
$imgs=按名称(扫描图像)散列文件;
$zips=按名称散列文件($scanned\u zips);
foreach($imgs作为$key=>$value)
{
回声';
回声';
如果(isset($zips[$key])){
回声';
echo'Download:'.$zips[$key].';
回声“

”; 回声'; } }
在内部
foreach
循环的末尾添加一条语句,这应该可以解决它。您有两个
foreach
循环,因此下载被多次列出。为了解决这个问题

将代码更改为:

<?php
foreach ($scanned_images as $value)
{
echo '<div class="portfolioItem">';
echo '<a href="screenshots/'.$value.'" class="zoom img" title="'.$value.'"      rel="portfolio">';
echo '<img src="screenshots/'.$value.'" class="portfolio-image" alt="'.$value.'" /> </a>';
    foreach ($scanned_zips as $val)
    {
    echo '<div class="portfolioDescription">';
    echo'<h4>Download:'.$val.'</h4>';
    echo'<p><a href="download/'.$val.'">Click here to download</a></p>';
    echo'</div></div>';
    break; //exiting
    }
}

?>

无需嵌套foreach

使用以下命令:

<?php

$images    = 'screenshots/';
$scanned_images = array_diff(scandir($images), array('..', '.'));
$zips = 'download/';
$scanned_zips = array_diff(scandir($zips), array('..', '.'));

foreach ($scanned_images as $value)
{
    $name = substr($value, 0, strrpos($value, '.'));
    $pos = array_search($name.'.zip', $scanned_zips);
    if($pos != null){
        echo '<div class="portfolioItem">';
        echo    '<a href="'.$images.$value.'" class="zoom img" title="'.$value.'" rel="portfolio">';
        echo        '<img src="'.$images.$value.'" class="portfolio-image" alt="'.$value.'" />';
        echo    '</a>';
        echo    '<div class="portfolioDescription">';
        echo        '<h4>Download:'.$scanned_zips[$pos].'</h4>';
        echo        '<p><a href="'.$zips.$scanned_zips[$pos].'">Click here to download</a></p>';
        echo    '</div>';
        echo '</div>';
    }
}

知道我为什么得了负分吗?太棒了!除了一个问题外,这是有效的。它没有列出所有的数组。31个图像和zip文件中只有5个。我无法找出原因。我发现丢失的文件名称不完全相同。大写和小写。现在它起作用了。非常感谢。