妙用php中的array_filter()获取数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_29673403/article/details/70943381

这种问题一般我们常见于页面上既要用到总表,又要用到其中某个用户单条数据的情况。而常见的两种解决方法是1.两次查库取出总表和符合条件的单条数据;(在数据库的数据量不多,涉及到的表较少的情况)2.取出总表用php foreach进行循环,在循环体中判断数据是否符合条件,符合则结束循环并返回这条数据(数据量大,涉及到的数据表多且结构复杂)。是不是哪一种看起来都很麻烦,太简单粗暴不太适合我这种追求矫情美感的人。
所以在这几天做项目涉及到这种情况且查出的结果集也比较庞大的时候,我就在想,数据库中的结果集都是以二维数组的形式取出存在php变量中,那么,如果能找到一个方法将这个二维数组中符合条件的一维数组抽出,不仅能够获得我们所需要的单条数据,同时还得到了该条数据在数据集中的位置(因为是键值对的形式)。所以抱着这样的想法小小的研读了一下php关于array数组的常用函数。果然让我找到了array_filter()这个函数,完美的解决了我的问题。执行代码如下(该代码所用的数组是我上篇文章生成的,不清楚的童鞋可以翻翻我的前一篇文章,这里我就不赘述了。):

<?php

  function test_odd($var)
  {

        if($var['user_id'] == 69)
            return 1;
        else
            return 0;

  }  

 $btb_user = $model->queryCountInfoWithUserId();

 $result = array_filter($btb_user,"test_odd");//若true,,返回符合条件的单条数据

 //var_dump(array_filter($btb_user,"test_odd"));
 //var_dump(array_keys($result));
 $locate = array_keys($result);
 echo $locate[0];//该条数据在结果集中的位置。
?>

看到这里是不是有点疑惑,我们要用的时候一般array_filter 不是在php里面如此奔放的存在在全局,而是在某个function之中,那回调函数这么写就会报错了。那我们就更简单一点像下面这样把回调函数直接当初array_filter()函数的第二个参数就行:

$sort_info = $model->queryCountInfoWithUserId();
        $simple_sort_info = array();
        $locate = 0;
        if($this->user_id != ''){
            $simple_sort_info = array_filter($sort_info, function ($var)
            {
                if($var['user_id'] == Yii::app()->session['user_id'])
                    return 1;
                    else
                        return 0;

            });
            $locate = array_keys($simple_sort_info);
            if(!empty($locate)){//找到
                $locate = $locate[0] + 1;
                $simple_sort_info = array_values($simple_sort_info);
                $simple_sort_info = $simple_sort_info[0];
            }else{
                $locate = '';
                $simple_sort_info['user'] = $this->user_name;
                $simple_sort_info['user_id'] = $this->user_id;
                $simple_sort_info['total_num'] = 0;
                $simple_sort_info['data'] = 0;
            }
        }

在这里mark一下,以后需要的时候就能很快的找到。大家有好的解决方法也希望能一块交流一下。共勉。今天版本更新,我要继续加班干活了。祝大家五一节快乐哦~

猜你喜欢

转载自blog.csdn.net/sinat_29673403/article/details/70943381