Php 如何引用下一个和上一个数组值?

Php 如何引用下一个和上一个数组值?,php,arrays,Php,Arrays,我想写一个简单的博客。在页面内容的底部,我放置了分页,其中显示指向下一个和上一个博客条目的链接,博客标题位于从数据库表pages,column menu_name获取的链接中。 为此,我首先进行了查询,并通过名为Blog的类中的函数创建了一个数组,然后设置了一些变量: $sql = "SELECT * FROM pages "; $sql .= "ORDER BY id DESC "; $pages = Blog::find_by_sql($sql); $blog_page = reset($p

我想写一个简单的博客。在页面内容的底部,我放置了分页,其中显示指向下一个和上一个博客条目的链接,博客标题位于从数据库表pages,column menu_name获取的链接中。 为此,我首先进行了查询,并通过名为Blog的类中的函数创建了一个数组,然后设置了一些变量:

$sql = "SELECT * FROM pages ";
$sql .= "ORDER BY id DESC ";
$pages = Blog::find_by_sql($sql);
$blog_page = reset($pages);
$page_id = Blog::find_by_id(isset($_GET['page']) ? $_GET['page'] : $blog_page->id);
然后我为上一个博客链接编写了如下代码:

public function pagination_previous(){
    global $address; //$address = "list_blogs.php?page=";
    global $page_id;
    global $pagination; //a class for storing functions that handle pagination
    global $pages;
    if($pagination->has_next_page()){
        echo "\n        <a class=\"olderblog\" href=" . $address;
        echo $pagination->next_page();
        echo " title=\"Newer Blog\">&laquo; ";
        foreach($pages as $page => $value){
            if($page_id->id + 1 == $value->id){
                echo $value->menu_name;
            }
        };
        echo "</a> ";   
    }else{
        echo "";
    }   
}
这是上一页:

public function previous_page(){
    global $blog;
    return $this->current_page - 1;
}
这非常有效,直到我决定创建一个可以删除博客条目的管理区。 当我删除id为6的博客条目时,问题就开始了。由于数据库表页面中不再有id=6的项目,因此在缺少页面之前和之后的页面上指向下一页或上一页的链接为空,但仍然指向页面=6,因为上一页从$current页面中减去1。 我通过如下设置pagination_next函数,找到了摆脱这种混乱局面的方法:

public function pagination_next(){
    global $address;
    global $pagination;
    global $page_id;
    global $pages;
    if($pagination->has_previous_page()){
        foreach($pages as $page => $value){
            if($page_id->id - 1 == $value->id){

                echo "\n        <a class=\"newerblog\" href=" . $address;
                echo $value->id;
                echo " title=\"Older Blog\">";
                echo $value->menu_name;
                break;
            }

        }
        echo " &raquo;</a> ";   
    }else{
        echo "";
    }   
}

有人能帮我解决这个问题吗

谢谢大家的回答,但不幸的是,没有一个能帮我解决问题。 在用尽了所有选项之后,我明确地得出结论,解决这个问题而不弄乱整个代码的唯一方法是找出如何在if条件中引用下一个或上一个现有的$value->id,而不加或减1以进入下一页,因为这会导致在数据库中缺少id时出现空链接。
如果有人能解决这个难题,我将永远感谢那个人。

我建议使用sql获取上一篇和下一篇博客文章

以前的职位

下一篇文章


功能齐全的选项可能是在博客对象上有一个持久序列索引字段。分页可以检查上一个/下一个序列索引。您可以编写函数,盲目地假设它们是真正连续的,并确保在删除POST时对它们重新编制索引,以实现easy+1/-1实现,也可以编写一个函数,从db中查找下一个最高/最低值。这将允许您任意移动它们,并确保它们的存在。将顺序与任意对象id分离。

在数组的foreach循环使用array\u values函数更新数组索引之前,它将重新为数组编制索引,因此现在您的逻辑将保持不变并正常工作。

您可以将上一页函数转换为以下内容:

public function previous_page( )
{
    global $blog;

    $prev = -1; // Initialize

    $arrayKeys = array_keys( $blog );

    rsort( $arrayKeys );    //  Sort keys array in reverse order

    while( list( $key ,$cursor ) = each( $arrayKeys ) )
    {
        if( $cursor == $this->current_page )
        {
            if( list( $key ,$prev ) = each( $arrayKeys ) ) return $prev;
            break;
        }
    }
    return $prev;
}
以下内容可能会让您更加了解:

//  Test data

$array = array( 0 => 'Obj 0' ,1 => 'Obj 1' ,2 => 'Obj 2' ,3 => 'Obj 3' ,4 => 'Obj 4' , );


$current = 3;   //  Try with any valid key of the array


//  Get the keys into an array

$arrayKeys = array_keys( $array );

//  Search for next

$next = -1; // Initialize

sort( $arrayKeys ); //  Sort the keys array

while( list( $key ,$cursor ) = each( $arrayKeys ) )
{
    if( $cursor == $current )
    {
        if( list( $key ,$cursor ) = each( $arrayKeys ) )
        {
            $next = $cursor;
        }
        break;
    }
}
//  Search for previous

$prev = -1; // Initialize

rsort( $arrayKeys );    //  Sort keys array in reverse order

while( list( $key ,$cursor ) = each( $arrayKeys ) )
{
    if( $cursor == $current )
    {
        if( list( $key ,$cursor ) = each( $arrayKeys ) )
        {
            $prev = $cursor;
        }
        break;
    }
}

if( $prev <> -1 )   echo '<br>Prev : ' ,$array[$prev];
if( $next <> -1 )   echo '<br>Next : ' ,$array[$next];

数组指针?我试过了。不起作用。请尝试我在回答中提供的功能。它通过测试数据进行测试,对我有效。我如何找到下一个最高/最低的索引?这正是我需要传递到if条件中的内容,但我无法理解。我制作了一个ID数组,而不是使用$arrayKeys,它就像一个符咒。非常感谢你,伙计!这真的帮了我很大的忙。
select * from pages where id = ( select max(id) from pages where id < <current_post_id> )
select * from pages where id = ( select min(id) from pages where id > <current_post_id> )
public function previous_page( )
{
    global $blog;

    $prev = -1; // Initialize

    $arrayKeys = array_keys( $blog );

    rsort( $arrayKeys );    //  Sort keys array in reverse order

    while( list( $key ,$cursor ) = each( $arrayKeys ) )
    {
        if( $cursor == $this->current_page )
        {
            if( list( $key ,$prev ) = each( $arrayKeys ) ) return $prev;
            break;
        }
    }
    return $prev;
}
//  Test data

$array = array( 0 => 'Obj 0' ,1 => 'Obj 1' ,2 => 'Obj 2' ,3 => 'Obj 3' ,4 => 'Obj 4' , );


$current = 3;   //  Try with any valid key of the array


//  Get the keys into an array

$arrayKeys = array_keys( $array );

//  Search for next

$next = -1; // Initialize

sort( $arrayKeys ); //  Sort the keys array

while( list( $key ,$cursor ) = each( $arrayKeys ) )
{
    if( $cursor == $current )
    {
        if( list( $key ,$cursor ) = each( $arrayKeys ) )
        {
            $next = $cursor;
        }
        break;
    }
}
//  Search for previous

$prev = -1; // Initialize

rsort( $arrayKeys );    //  Sort keys array in reverse order

while( list( $key ,$cursor ) = each( $arrayKeys ) )
{
    if( $cursor == $current )
    {
        if( list( $key ,$cursor ) = each( $arrayKeys ) )
        {
            $prev = $cursor;
        }
        break;
    }
}

if( $prev <> -1 )   echo '<br>Prev : ' ,$array[$prev];
if( $next <> -1 )   echo '<br>Next : ' ,$array[$next];