如何在PHP中对foreach进行分页?

时间:2016-09-10 10:55:35

标签: php foreach pagination

我唯一能做的就是将foreach限制为8,但实际上,我想要的是让它分页。

代码确实在"帖子中显示了一些帖子"文件夹,但正如我所说,我想要的是分页。

<?php
$ruta = "posts"; // Indicar ruta
$directorio = opendir($ruta);
$get = new DOMDocument('1.0', 'utf-8');
libxml_use_internal_errors(true);
while ($archivo = readdir($directorio)) {
    if($archivo != '.' && $archivo != '..' && $archivo != '.htaccess' && substr($archivo, -4) == '.php') {
        $entradas[$archivo] = filemtime($ruta."/".$archivo);
} //Fin de la Condicion if
} //Fin del While
arsort ($entradas);
closedir($directorio);

function limit($iterable, $limit) {
    foreach ($iterable as $key => $value) {
        if (!$limit--) break;
        yield $key => $value;
    }
}

// $array_slice_feed = array_slice($entradas, (count($entradas) - 5));

foreach (limit($entradas, 8) as $archivo => $timestamp) {
        //Extraemos el Contenido de los Post para despues Mostrarlo
        $post = $archivo;
        $get->loadHTML(mb_convert_encoding(file_get_contents("posts/$post"), 'HTML-ENTITIES', 'UTF-8'));
        $contenedor = $get->getElementById('post');
        $img = $contenedor->getElementsByTagName('img');
        $imagen = $img->item(0)->getAttribute('src');

        $get->loadHTML(mb_convert_encoding(file_get_contents("posts/$post"), 'HTML-ENTITIES', 'UTF-8'));
        $contenedor = $get->getElementById('post');
        $title = $contenedor->getElementsByTagName('div');
        $titulo = $title->item(0)->nodeValue;

        $get->loadHTML(mb_convert_encoding(file_get_contents("posts/$post"), 'HTML-ENTITIES', 'UTF-8'));
        $contenedor = $get->getElementById('post');
        $des = $contenedor->getElementsByTagName('div');
        $descripcion = $des->item(1)->nodeValue;

        $get->loadHTML(mb_convert_encoding(file_get_contents("posts/$post"), 'HTML-ENTITIES', 'UTF-8'));
        $contenedor = $get->getElementById('post');
        $author = $contenedor->getElementsByTagName('div');
        $autor = $author->item(2)->nodeValue;

        $get->loadHTML(mb_convert_encoding(file_get_contents("posts/$post"), 'HTML-ENTITIES', 'UTF-8'));
        $contenedor = $get->getElementById('post');
        $fecha1 = $contenedor->getElementsByTagName('div');
        $fecha2 = $fecha1->item(3)->nodeValue;

        $get->loadHTML(mb_convert_encoding(file_get_contents("posts/$post"), 'HTML-ENTITIES', 'UTF-8'));
        $contenedor = $get->getElementById('post');
        $DataDia = $contenedor->getElementsByTagName('div');
        $Data_Dia = $DataDia->item(3)->getAttribute("data-day");

        $get->loadHTML(mb_convert_encoding(file_get_contents("posts/$post"), 'HTML-ENTITIES', 'UTF-8'));
        $contenedor = $get->getElementById('post');
        $DataMes = $contenedor->getElementsByTagName('div');
        $Data_Month = $DataMes->item(3)->getAttribute("data-mes");

        $get->loadHTML(mb_convert_encoding(file_get_contents("posts/$post"), 'HTML-ENTITIES', 'UTF-8'));
        $contenedor = $get->getElementById('post');
        $hora1 = $contenedor->getElementsByTagName('div');
        $hora2 = $hora1->item(4)->nodeValue;

        $get->loadHTML(mb_convert_encoding(file_get_contents("posts/$post"), 'HTML-ENTITIES', 'UTF-8'));
        $contenedor = $get->getElementById('post');
        $desW = $contenedor->getElementsByTagName('div');
        $descripcionWeb = $desW->item(5)->nodeValue;

        $desde = 0;
        $hasta = 56;

        if (isset($_GET['cat'])) {
            $cadena_buscada = $_GET['cat'];
        } elseif (isset($_GET['buscar'])) {
            $cadena_buscada = $_GET['buscar'];
        }else{
            $cadena_buscada = NULL;
        }

        if (preg_match("/$cadena_buscada/i", "$descripcion")) {
            echo "
            <article>
                <div class='thumb'>
                    <img src='$imagen' />
                </div>

                <a href='$ruta/$archivo'>
                    $titulo
                    <span><i class='icon-folder2'></i> $descripcion</span>
                </a>
            </article>
            ";
        } else if (preg_match("/$cadena_buscada/i", "$titulo")) {
            echo "
            <article>
                <div class='thumb'>
                    <img src='$imagen' />
                </div>

                <a href='$ruta/$archivo'>
                    $titulo
                    <span><i class='icon-folder2'></i> $titulo</span>
                </a>
            </article>
            ";
        }
}
?>

1 个答案:

答案 0 :(得分:1)

我无法测试没有数据,如果你想要分页,你必须指定起点,而不仅仅是每页限制。另外我不知道你为什么使用yield,如果你只使用array_slice作为那个逻辑,它可能会更具可读性,我也删除了部分重复代码......

    <?php
    $ruta = "posts"; // Indicar ruta
    $directorio = opendir($ruta);
    $get = new DOMDocument('1.0', 'utf-8');
    libxml_use_internal_errors(true);
    while ($archivo = readdir($directorio)) {
        if($archivo != '.' && $archivo != '..' && $archivo != '.htaccess' && substr($archivo, -4) == '.php') {
            $entradas[$archivo] = filemtime($ruta."/".$archivo);
        } //Fin de la Condicion if
    } //Fin del While
    arsort ($entradas);
    closedir($directorio);

    function limit($iterable, $from, $per_page = 8)
    {
        $i    = 0;
        $page = 0;
        foreach ($iterable as $key => $value) {
            ++$page;
            if ($from <= $page && $i < $per_page) {
                ++$i;
                yield $key => $value;
            }
        }
    }

    # pagination start
    $per_page     = 8;
    $num_of_pages = count($entradas);
    $from         = (int)(isset($_GET['from']) ? $_GET['from'] : 0);
    unset($_GET['from']);
    $query_string = http_build_query($_GET);

    for ($i = 0; $i <= floor(($num_of_pages-1) / $per_page); $i++) {
        echo " <a href='?from=$i&$query_string'> " . ($i + 1) . " </a> | ";
    }
    echo "<br>";
    # pagination end

    foreach (limit($entradas, $from * $per_page, $per_page) as $archivo => $timestamp) {
        //Extraemos el Contenido de los Post para despues Mostrarlo
        $post = $archivo;
        $get->loadHTML(mb_convert_encoding(file_get_contents("posts/$post"), 'HTML-ENTITIES', 'UTF-8'));
        $contenedor = $get->getElementById('post');
        $img        = $contenedor->getElementsByTagName('img');
        $imagen     = $img->item(0)->getAttribute('src');

        $title          = $contenedor->getElementsByTagName('div');
        $titulo         = $title->item(0)->nodeValue;
        $descripcion    = $title->item(1)->nodeValue;
        $autor          = $title->item(2)->nodeValue;
        $fecha2         = $title->item(3)->nodeValue;
        $Data_Dia       = $title->item(3)->getAttribute("data-day");
        $Data_Month     = $title->item(3)->getAttribute("data-mes");
        $hora2          = $title->item(4)->nodeValue;
        $descripcionWeb = $title->item(5)->nodeValue;

        $desde = 0;
        $hasta = 56;

        if (isset($_GET['cat'])) {
            $cadena_buscada = $_GET['cat'];
        } elseif (isset($_GET['buscar'])) {
            $cadena_buscada = $_GET['buscar'];
        } else {
            $cadena_buscada = null;
        }

        if (preg_match("/$cadena_buscada/i", "$descripcion")) {
            echo "
                <article>
                    <div class='thumb'>
                        <img src='$imagen' />
                    </div>

                    <a href='$ruta/$archivo'>
                        $titulo
                        <span><i class='icon-folder2'></i> $descripcion</span>
                    </a>
                </article>
                ";
        } else if (preg_match("/$cadena_buscada/i", "$titulo")) {
            echo "
                <article>
                    <div class='thumb'>
                        <img src='$imagen' />
                    </div>

                    <a href='$ruta/$archivo'>
                        $titulo
                        <span><i class='icon-folder2'></i> $titulo</span>
                    </a>
                </article>
                ";
        }
    }