对这个嵌套循环更优雅的解决方案,任何人?

jaz*_*cam 1 php

我有一个PHP程序,扫描目录,其内容是PDF文件的缩略图.然后缩略图显示在表格中,并包含在父网页的iframe中.每个缩略图本身都是一个超链接,当点击它将打开实际的pdf文件.为了避免使用水平滚动条,表格行中的9个图像是完美的.我写了一个嵌套循环,实际上就像一个自动换行,它显示9个图像,然后开始另一行.实际的代码更加紧凑,所以我把它简化为一个最基本的例子.乍一看似乎几乎是反直觉的,在外环的第二行减少了$ i,但它确实有效.我想知道是否有人有更优雅的解决方案?

$ary = array(1,2,3,4,5,6,7,8,9,10);

for ($i=1; $i<(count($ary)+1); $i++) {
    $i = $i-1;
    for($j=0; $j<9; $j++) {
        if ($i === count($ary)) break;
        echo ($ary[$i].",  ");
        $i+=1;
    }
    echo "<br>";
}
Run Code Online (Sandbox Code Playgroud)

完成的代码现在$ ndx是数组的计数,$ dir是包含png图像的扫描目录,$ rtDir是保存pdf的目录:

if ($ndx > 0) {
$tbl = '<div id="draggable" class="ui-widget-content">
        <ul>
        <table><tr>';
        /* place 9 images on one row */
        foreach ($myfiles as $index => $image) {
            $pdf  = basename($image, ".png");
            $pdf  = $pdf . ".pdf";
            $pdf  = $rtDir.$pdf;
            $tbl .= '<td>
                        <span class="zoom">
                            <a href="'.$pdf.'" target="_blank">
                                <li><img id="pdfthumb'.$index.'" class="myPhotos" alt="pdf'.$index.'" src="'.$dir.$image.'" ></li>
                            </a>
                        </span>
                    </td>';
            if ($index % 9 == 8) {
                /* end the current row and start a new one */
                $tbl.= "</tr></table><br><br><table style='margin-top:-40px'><tr>";
            }
        }
    $tbl .= "</tr></table></ul></div>";
    printf($tbl);
    unset($myfiles);
}
Run Code Online (Sandbox Code Playgroud)

谢谢大家的建议.

Joe*_*inz 5

所以你想要每行9张图片?通常有两种逻辑选择:

备选方案1:您使用array_chunk(),例如:

$chunks = array_chunk($images, 9);
foreach ($chunks as $chunk) {
    foreach ($chunk as $image) {
        // image printing goes here
    }
    echo '<br'>;
}
Run Code Online (Sandbox Code Playgroud)

备选方案2:您使用模运算符,例如:

foreach ($images as $index => $image) {
    // images printing goes here
    if ($index % 9 == 0) { // or 8, since it's a 0-index array... I don't remember
        echo '<br>';
    }
}
Run Code Online (Sandbox Code Playgroud)

我大多使用第二个版本,我自己,如果必须的话 - 或者我要求我们的设计师通过css使其适合宽度.请注意,如果图像数组是关联的,则第二个版本将不起作用.