1. 程式人生 > >妙用php中的array_filter()獲取資料

妙用php中的array_filter()獲取資料

這種問題一般我們常見於頁面上既要用到總表,又要用到其中某個使用者單條資料的情況。而常見的兩種解決方法是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一下,以後需要的時候就能很快的找到。大家有好的解決方法也希望能一塊交流一下。共勉。今天版本更新,我要繼續加班幹活了。祝大家五一節快樂哦~