2014-10-20 2 views
-1

Есть ли способ определить последнюю итерацию цикла foreach и реализовать какой-то другой код?Захватить последнюю итерацию цикла foreach (где последняя итерация должна отличаться)

Я пытаюсь выполнить итерацию по массиву и вывести его части в таблицу.

Вот пример моего массива:

array(2) { 
    [0]=> array(3) { 
     [date]=> string(10) "2013-09-18" 
     [title]=> string(75) "Ready For Retina HD: Create Pixel-Perfect Assets For Multiple Scale Factors" 
     [filepath]=> string(74) "ready-for-retina-hd-create-pixel-perfect-assets-for-multiple-scale-factors" 
    } 
    [1]=> array(3) { 
     [date]=> string(10) "2010-10-20" 
     [title]=> string(40) "Taking A Closer Look At Tech Conferences" 
     [filepath]=> string(40) "taking-a-closer-look-at-tech-conferences" 
    } 
} 

Для каждой части, я хочу, чтобы вывести title, то я хочу, чтобы вывести filepath в качестве связующего звена, в двух разных местах (один раз это " просмотреть ", а другой - ссылку" изменить ").

Мне нужно пробежать массив и сделать каждый из этих трех элементов в строку таблицы, поэтому я внедрил счетчик, который вставляет </tr><tr> каждые 3 элемента, чтобы отрезать старую строку и начать новую.

Это прекрасно работает единственная проблема заключается в случае последнего пункта, потому что она всегда будет открывать новую строку из-за последнего <tr>

Как я могу перестроить это так, что она не открывает строку на последнем счете?

echo "<table border='2'><tbody><tr>"; 
foreach ($myarray as $post){ 
    // Adds to count, outputs title 
    echo "<td>" . $post['title'] . "</td>"; 
    $rowcounter++; 

    // Adds to count, outputs filepath with "view" 
    echo "<td><a href='../posts/post-" . $post['filepath'] . "'>View</a></td>"; 
    $rowcounter++; 

    // Adds to count, outputs filepath with "edit" 
    echo "<td><a href='../posts/post-" . $post['filepath'] . "?edit=true'>Edit</a></td>"; 
    $rowcounter++; 

    // Tests the count 
    echo 'rowcounter = ' . $rowcounter; 
    if ($rowcounter == "3"){ 
     $rowcounter = 0; 
     echo "</tr><tr>"; 
    } 
} 
echo "</tr></tbody></table>"; 
+0

Ваше название вопроса не соответствует вашему вопросу. Измените свой цикл на 'foreach ($ myarray as $ key => $ post) {', а затем, чтобы увидеть, находитесь ли вы в последнем элементе 'if ($ key == (count ($ myarray) -1)) {'. Хотя есть лучшие решения. – EvilZebra

ответ

3

Рендер ваши <tr> S только внутри цикла, а не открывать и закрывать до и после, соответственно.

Насколько я могу судить, вам не нужно держать счет ваших «строк» ​​(которые, кстати, являются столбцами). Вы итерация для каждой строки, так всех ваших за строки разметки должен находиться между вашим foreach фигурных скобками:

echo "<table border='2'><tbody>"; 
foreach ($myarray as $post){ // One iteration per row 
    echo '<tr>'; // Row STARTS here. 

    echo "<td>" . $post['title'] . "</td>"; 
    echo "<td><a href='../posts/post-" . $post['filepath'] . "'>View</a></td>"; 
    echo "<td><a href='../posts/post-" . $post['filepath'] . "?edit=true'>Edit</a></td>"; 

    echo '</tr>'; // Row ENDS here. 
} 
echo "</tbody></table>"; 
+0

Спасибо, это имеет смысл :) – Francesca

+0

Рад помочь (: – George

0

Я рекомендую ответ Джордж для этого, но для дальнейшего использования можно альтернативно либо использовать цикл вместо Еогеаспа :

foreach ($i=0; $i < count($myarray); $i++){ 
    $post = $myarray[$i]; 
    ... 

затем проверить $ я против графа $ MyArray

или вы могли бы добавить подсчитывать строки в цикле, который получает приращение на каждой итерации и сделать проверку в отношении количества строк в $ MyArray

Смежные вопросы