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

[已解决] 关于带条件分页(主要用于搜索中),最简单有效的解决...

[复制链接]
发表于 2012-11-24 22:58:58 | 显示全部楼层 |阅读模式
本帖最后由 qingxin 于 2012-12-12 13:06 编辑

今天遇到这个问题,网上搜了一下,未果(觉得网上流传的方法太麻烦了),所以自己动手解决了。由于涉及到很多内容,具体的代码我就不贴出来了,只提供一下思路。

首先,由于前一周研究了一周正则表达式,所以自然而然我第一个想法就是用正则表达式解决这个问题,没想到顺利异常。

以下是参考代码,视实际情况而定,最好和不带条件的方法分开,不要写到一个方法里。

//自动搜索查询条件
$condition = empty($_POST) ? $_GET : $_POST;
$links = $this->links($total,$per,$seg);//这边是得到普通的分页字符串,这里只是示例,开发者依据实际情况而定
//生成查询条件
$condition_str = '?';
foreach ($condition as $key => $value)
{
   $condition_str .= '&'.$key.'='.$value;
}
//正则替换并返回
return preg_replace('/href="(.*?)"/','href="$1'.$condition_str.'"', $links);



2012-12-12补充:
在生成查询字符串时还需要一步遍历get或post数组的过程(主要是为了适应post或get数组是多维数组的情况,如果能确保get或post数组始终是一维数组,忽略这段补充),建议写成一个递归函数进行调用

下面这一段
//生成查询条件
$condition_str = '?';
foreach ($condition as $key => $value)
{
$condition_str .= '&'.$key.'='.$value;
}

替换成
//生成查询条件
$condition_str = substr_replace(url_get($condition), '?', 0, 1);

引用的数组遍历函数
PHP复制代码
 
function url_get($array,$key = NULL)
{
        if(!is_array($array))
        {
                if(empty($key))
                {
                        return NULL;
                }
                else
                {
                        return '&'.$key.'='.$array;
                }
        }
        else
        {
                $ret = NULL;
                foreach ($array as $ke => $val)
                {
                        $ret .= url_get($val,$key.'['.$ke.']');
                }
                $ret = preg_replace('/&\[(.*?)\]/', '&$1', $ret);
 
                return $ret;
        }
}
 
复制代码


评分

参与人数 1威望 +5 收起 理由
Hex + 5 赞一个!

查看全部评分

发表于 2012-11-25 00:28:23 | 显示全部楼层
具体实现什么功能没有说清楚啊。。。
 楼主| 发表于 2012-11-25 09:01:11 | 显示全部楼层
等到你在分页上有疑惑的时候再来看吧,多说无益
 楼主| 发表于 2012-11-25 09:07:54 | 显示全部楼层
基于你已经能够正确分页的假设,这个是用来实现有搜索条件时怎么在分页上维持搜索条件的,我不会再回复了,看不懂就算了,只是个小技巧而已
发表于 2012-11-25 13:40:31 | 显示全部楼层
感谢楼主的分享~

PS 分页类本身应该可以实现楼主的需求吧,呵呵
发表于 2012-11-25 16:41:27 | 显示全部楼层
Hex 发表于 2012-11-25 13:40
感谢楼主的分享~

PS 分页类本身应该可以实现楼主的需求吧,呵呵

Hex 说得对哦

关于查询条件的处理还是写在model里更好吧
这样就用本身的分页类足够了

因为没太明白LZ的意思,LZ就当我说梦话在吧
若有疑问,期待和LZ进一步探讨哦
发表于 2012-11-25 18:22:27 | 显示全部楼层
qingxin 发表于 2012-11-25 09:07
基于你已经能够正确分页的假设,这个是用来实现有搜索条件时怎么在分页上维持搜索条件的,我不会再回复了, ...

在基础掌握牢靠的时候才能这么吊

1、闭门造车并不是好事
2、PHP手册必须熟读
3、ci手册要看,类库最好能够看明白点
4、面对别人的质疑要以平常心对待
5、技巧不是这么随便写个东西就能定义的
发表于 2012-11-25 21:39:36 | 显示全部楼层
我的分页早就实现了多条件搜索、排序等高级功能了。。。。
发表于 2012-12-2 11:29:22 | 显示全部楼层
隐约感觉lz要悲剧,回来一看果然悲剧了
 楼主| 发表于 2012-12-12 12:56:17 | 显示全部楼层
本帖最后由 qingxin 于 2012-12-12 13:05 编辑

在生成查询字符串时还需要一步遍历get或post数组的过程(主要是为了适应post或get数组是多维数组的情况,如果能确保get或post数组始终是一维数组,忽略这段补充回复),建议写成一个递归函数进行调用

下面这一段
//生成查询条件
$condition_str = '?';
foreach ($condition as $key => $value)
{
$condition_str .= '&'.$key.'='.$value;
}

替换成
//生成查询条件
$condition_str = substr_replace(url_get($condition), '?', 0, 1);

引用的数组遍历函数
PHP复制代码
 
function url_get($array,$key = NULL)
{
        if(!is_array($array))
        {
                if(empty($key))
                {
                        return NULL;
                }
                else
                {
                        return '&'.$key.'='.$array;
                }
        }
        else
        {
                $ret = NULL;
                foreach ($array as $ke => $val)
                {
                        $ret .= url_get($val,$key.'['.$ke.']');
                }
                $ret = preg_replace('/&\[(.*?)\]/', '&$1', $ret);
 
                return $ret;
        }
}
 
复制代码

本版积分规则