ztkx 发表于 2009-2-21 15:46:16

如何取PHP数组的相邻位

应该是比较常见,根据id返回文章,然后底部加上相邻的文章链接,因为所有的文章都是放在一个表中的,所以同类文章的id未必是连续的,
我的做法是取当前文章的分类,然后根据分类得到此类文章的id数组,按时间排列
当取相邻id的时候,就定位到数组的相应位置,然后去前一位后一位好了
可是PHP数组函数中好像没有位置的函数,如果是a,a之类的倒没什么问题,如果是更通用的,PHP数组不需要key是连续的,更未必是数字,相关的数组函数只有current, next, prev,end

初步的解决方案是

foreach( $id_arr as $id) {
   if ( $id == $matched_id) {
             $next = current($id);// 很奇怪为什么current变成下一个了,但我测试是这样的
             prev($id_arr);
             $prev = prev($id_arr);
   }
}


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

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

prev($id_arr);


             $prev = prev($id_arr);


但是这样的话,在我这里,指针似乎并不往回走,所以$prev仍然是null, 该怎么做呢

Hex 发表于 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) 。

ztkx 发表于 2009-2-23 12:52:49

select 是可以,但是每次都要操作数据库,数组看起来似乎麻烦,但是效率应该高不少

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