用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3605|回复: 4
收起左侧

如何取PHP数组的相邻位

[复制链接]
发表于 2009-2-21 15:46:16 | 显示全部楼层 |阅读模式
应该是比较常见,根据id返回文章,然后底部加上相邻的文章链接,因为所有的文章都是放在一个表中的,所以同类文章的id未必是连续的,
我的做法是取当前文章的分类,然后根据分类得到此类文章的id数组,按时间排列
当取相邻id的时候,就定位到数组的相应位置,然后去前一位后一位好了
可是PHP数组函数中好像没有位置的函数,如果是a[0],a[2]之类的倒没什么问题,如果是更通用的,PHP数组不需要key是连续的,更未必是数字,相关的数组函数只有current, next, prev,end

初步的解决方案是

  1. foreach( $id_arr as $id) {
  2.    if ( $id == $matched_id) {
  3.              $next = current($id);  // 很奇怪为什么current变成下一个了,但我测试是这样的
  4.              prev($id_arr);
  5.              $prev = prev($id_arr);
  6.    }
  7. }
复制代码


这个代码看起来是可行的,但是他并没有考虑到边界的问题,似乎PHP并没有数组的边界检查函数,我只好这样做

  1. if ($next == null){
  2.             $next = -1;
  3. }

  4. prev($id_arr);


  5.              $prev = prev($id_arr);
复制代码


但是这样的话,在我这里,指针似乎并不往回走,所以$prev仍然是null, 该怎么做呢
发表于 2009-2-21 15:49:46 | 显示全部楼层
不属于 CI,所以我给转移了。
发表于 2009-2-23 06:46:51 | 显示全部楼层
你这样用array取ID太麻烦了。

假设当前文章ID为5。

取prev则 SELECT * FROM posts WHERE ID < 5 LIMIT 0, 1
取next则 SELECT * FROM posts WHERE ID > 5 LIMIT 0, 1

用CI的query builder也是相仿。
发表于 2009-2-23 07:01:06 | 显示全部楼层
另外,next(), prev() 和 current() 都会返回 false 的。

你一定要用foreach的话,直接用 next()/prev()/current() 来检查,没必要用 if ($next == null) 。
 楼主| 发表于 2009-2-23 12:52:49 | 显示全部楼层
select 是可以,但是每次都要操作数据库,数组看起来似乎麻烦,但是效率应该高不少

每次都用next()/prev()/current() 来检查,是不是太混乱了,next之后,指针就跑到下一个了,所以必须手动回来, 应该有边界检查的,尤其是php数组,key不必为连续整数,count-1 就完全没办法使用

本版积分规则