2012-11-29 113 views
0

好吧,我已經有PHP成功地打開並閱讀包含許多圖像的目錄的內容。我把所有這些數據都傳遞給一個數組,對結果進行排序,最後遍歷所有的圖像,這樣我就可以回到html頁面了。在這個字符串中,我爲每個div設置了css類,以便在頁面呈現每個div時正確顯示。回聲PHP字符串

我的問題是與實際的PHP設置每個div的類。基本上我有兩個類,我適用於每個div取決於他們是什麼數字。例如,在第一個水平行中,第一到第三個div得到.box的類別,以便設置margin-right:10px;和第四個get的它自己的類別.box last,其設置margin-right:0px;

所以我想問的是有沒有辦法編寫一些邏輯來告訴PHP代碼應用一個類的第一到第三個div和一個單獨的類每個第四個div的有效的前三個div在行上get類和每行中的第四個div得到另一個?

<?php 
$dir = "images/"; 

$images = array(); 

$returnstr = ""; 

if ($handle = opendir($dir)) { 
    while (false !== ($entry = readdir($handle))) { 
     if ($entry != "." && $entry != ".."){ 
      $images[] = $entry; 
     } 
    } 
    closedir($handle); 
} 

natsort($images); 

$newArray = array_values($images); 

foreach ($newArray as $key => $value) { 
    $returnstr .= '<li class="box">'; 
    $returnstr .= '<a href="#" name="" class="thumb" id="' . $key . '"><img src="'. $dir . '/' . $value . '"/></a>'; 
    $returnstr .= '</li>'; 
} 

?> 

這是第一次的CSS - 3 div的...

.box { 

float: left; 
/*margin-right:10.5px;*/ 
margin-right:10px; 
/*width: 92px; 
height: 92px; */ 
width: 232.5px; 
height:150px; 
/*height: 232px; */ 
/*background-color: #999; 
border: 1px solid*/ 
margin-bottom: 10px; 
list-style: none; 
} 

...和CSS在網格每4個DIV

.box.last { 
margin-right: 0px; 
} 

這是HTML我試圖實現。

<li class="box"> 
    <a href="#" name="cap1" class="thumb" id=""><img src="images/1.jpg"/></a> 
</li> 

<li class="box"> 
    <a href="#" name="cap2" class="thumb" id=""><img src="images/2.jpg"/></a> 
</li> 

<li class="box"> 
    <a href="#" name="cap3" class="thumb" id=""><img src="images/3.jpg"/></a> 
</li> 

<li class="box last"> 
    <a href="#" name="cap4" class="thumb" id=""><img src="images/4.jpg"/></a> 
</li> 
+0

刪除所有無關緊要的東西,準確地告訴我們,但用更少的話,你嘗試了什麼以及你失敗了。這個問題太長了! – markus

+0

這可以在客戶端有效地完成,沒有額外的CSS,使用':nth-​​child()'。 –

+0

@MadaraUchiha我不認爲op只是爲了第(n)個孩子。他們希望爲每一個孩子,對吧? – shortstuffsushi

回答

0

您可以使用modulus operator, %以及每次在循環中增加的整數執行此操作。簡單的例子:

<?php 

$n = 0; 
foreach ($newArray as $key => $value) { 
    $n++; 
    if($n > 0 && ($n % 4) === 0){ 
     $everyFourthRowCss = " last"; 
    } else { 
     $everyFourthRowCss = ""; 
    } 
    $returnstr .= "<li class='box{$everyFourthRowCss}'>"; 
    $returnstr .= '<a href="#" name="" class="thumb" id="' . $key . '"><img src="'. $dir . '/' . $value . '"/></a>'; 
    $returnstr .= '</li>'; 
} 
+0

嗨@JoshuaBeall感謝您的回答,但我需要改變的一件事是在if語句中&n到$ n。除此之外,它就像一個魅力! – user1563944

+0

@ user1563944我的錯字,抱歉!我只是修復它。 – Josh

0

您需要使用modulos,像:

foreach ($newArray as $key => $value) { 
    $returnstr .= '<li class="box'; 
    if (($key > 0) && (($key % 4) == 0)) { 
     $returnstr .= ' last'; 
    } 
    $returnstr .= '">'; 
    $returnstr .= '<a href="#" name="" class="thumb" id="' . $key . '"><img src="'. $dir . '/' . $value . '"/></a>'; 
    $returnstr .= '</li>'; 
} 
+0

謝謝@ninsuo我相信你的方法可行,但我無法繞過模塊東西 – user1563944

0

這可以通過更改foreach循環做:

$i = 1; 
foreach ($newArray as $key => $value) { 
    $last_class = ($i == 4) ? ' last' : '' ; 
    $returnstr .= '<li class="box' . $last_class . '">'; 
    $returnstr .= '<a href="#" name="" class="thumb" id="' . $key . '"><img src="'. $dir . '/' . $value . '"/></a>'; 
    $returnstr .= '</li>'; 
    $i++; 
} 

這樣,無論什麼$key是(以關聯數組的情況下),您仍然只將其應用於第四項。

0
foreach($newArray as $key => $value) { 
    if($key % 4 == 0) { 
     $returnstr .= '<li class="box last">'; 
    } else { 
     $returnstr .= '<li class="box">'; 
    } 
} 

試試看。

0

這可能是骯髒的,但你可以簡單地用一個計數器如下:

$counter = 1; 
foreach ($newArray as $key => $value) { 
    if ($counter==4) { 
     $returnstr .= '<li class="last">'; 
    } 
    else 
    { 
     $returnstr .= '<li class="box">'; 
    } 
    $returnstr .= '<a href="#" name="" class="thumb" id="' . $key . '"><img src="'. $dir . '/' . $value . '"/></a>'; 
    $returnstr .= '</li>'; 

    $counter++; 
} 

它應該做的伎倆。

1

不是添加.last類PHP的,你可以使用一個CSS選擇給予特別緣至第四<li>元素(S),像這樣:

li.box:nth-child(4){ 
    margin-right: 0px; 
} 

這將適用於任何<li>這是其父容器的第四個孩子

+1

,但要小心瀏覽器支持:http:// caniuse .com/css-sel3 – swatkins

+0

感謝您指出。看起來像一個相當有用的網站 – Sharlike