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

时间:2013-10-16 17:45:07

标签: php arrays

我正在尝试制作一个简单的博客。在页面底部的内容中我放置了分页,其中显示了指向下一个和上一个博客条目的链接,博客标题位于我从数据库表中获取的链接中,名为“pages”,列为“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 "";
    }   
}

这是函数has_next_page()

public function has_previous_page(){
    return $this->previous_page() >= 1 ? true : false;  
}

这是previous_page():

public function previous_page(){
    global $blog;
    return $this->current_page - 1;
}

这很好用,直到我决定在哪里删除博客条目的管理区域。 当我删除一个id为6的博客条目时,问题就出现了。由于数据库表“pages”中没有id = 6的项目,所以在缺失之前和之后的页面上的下一页或上一页的链接页面为空但仍然指向page = 6,因为has_previous_page()从$ current_page中减去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 "";
    }   
}

然而,由于foreach循环中的if条件,这仍然不起作用。 我需要在pagination_previous()和pagination_next()中设置这个条件,以根据其数组索引($ page)引用下一个和上一个数组项,而不是id($ value-&gt; id)但我不能想一想我的生活。这就是数组$ pages的样子:

Array
(
[0] => Blog Object
    (
        [id] => 8
        [subject_id] => 2
        [menu_name] => Aliquam sed interdum
        [position] => 4
        [visible] => 1
        [created] => 
        [content] => 
    Aliquam sed interdum tortor. Vivamus et blandit velit...

[1] => Blog Object
    (
        [id] => 7
        [subject_id] => 2
        [menu_name] => Vestibulum ante ipsum
        [position] => 3
        [visible] => 1
        [created] => 
        [content] => 
    Vestibulum ante ipsum primis in faucibus orci luctus et ultrices...

[2] => Blog Object
    (
        [id] => 5
        [subject_id] => 2
        [menu_name] => Praesent massa mi
        [position] => 2
        [visible] => 1
        [created] => 
        [content] => 
    Praesent massa mi, pretium et leo vitae, aliquam...

[3] => Blog Object
    (
        [id] => 4
        [subject_id] => 2
        [menu_name] => Nam interdum tincidunt
        [position] => 1
        [visible] => 1
        [created] => 
        [content] => 
    Nam interdum tincidunt purus quis lacinia. Aliquam erat volutpat.
)

有人可以帮我解决这个问题吗?

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

4 个答案:

答案 0 :(得分:1)

您可以将previous_page功能转换为以下内容:

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];

答案 1 :(得分:0)

我建议使用sql来获取上一个和下一个博客条目

上一篇文章

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> )

答案 2 :(得分:0)

全功能选项可能是在博客对象上有持久序列索引字段。分页可以检查上一个/下一个序列索引。您可以编写函数来盲目地假设它们是真正顺序的(并确保在删除帖子时重新索引它们)以便于实现简单的+ 1 / -1或编写找到下一个最高/最低的函数(可能来自数据库) )。这将允许您任意移动它们以确保存在。从任意对象id解除顺序。

答案 3 :(得分:0)

在数组的foreach循环使用array_values函数更新数组索引之前,它将重新索引数组,所以现在你的逻辑将保持不变并正常运行。