找到此Yii 2查询中的位置

时间:2017-11-13 17:27:34

标签: php mysql yii yii2

我有以下Yii 2查询

$find = People::find()->where(['c_id' => $c_id])->orderBy('totals DESC, id DESC')->all();

所以想象这个查询是一个数组。此查询找到的所有内容都具有“id”属性。

由于它按“总计”排序,我基本上想要返回数组中可以找到此特定ID的位置。

目前,我正在使用此代码。

foreach ($find as $t) {
    $arr[] = $t->id;

    if ($t->id == $id) {
        break;
    }
}

$key = count($arr);

return $key;

但是,这个代码在100k +结果查询中是一个很好的方法。

反正有加速吗?

3 个答案:

答案 0 :(得分:0)

要从YII中的查询中获取数组,您可以使用queryAll();

$find = People::find()->where(['c_id' => $c_id])->orderBy('totals DESC, id DESC')->queryAll();

OR,将对象转换为数组的另一种方法是:

$find = json_decode(json_encode($find), true);  // to convert all data into array.

一旦你得到数组中的结果,你就可以实现你需求的实际代码,如下所示。

您可以使用array_search()函数获取值的索引。

$a=array("a"=>"red","b"=>"green","c"=>"blue");
echo array_search("red",$a);

array_search()函数在数组中搜索值并返回键。

答案 1 :(得分:0)

您可以将结果作为数组(而不是对象)获取

$find = People::find()->where(['c_id' => $c_id])
        ->orderBy('totals DESC, id DESC')
        ->asArray()
        ->all();

然后你可以使用array_search()

找到你的值
$my_index =  array_search($id,$find);

但对于100k +你应该发现在db中使用直接选择...而不是在php上循环或在php中加载所有并使用array_search扫描()

答案 2 :(得分:0)

也许我没有正确理解你,但我认为你试图在class getMinError(): def __init__(self): self.error = 0 self.ce1 = 0 self.ce2 = 0 def process(self): for i in range(any number): run to get error, ce1,and ce2 save the first run's result to self.error, self.ce1,and self.ce2 内找到所需index的{​​{1}}或key来自id查询,该查询按其他列排序,如array

因此,让我们使用您的查询从数据库中获取记录,并稍作更改asArray()

SQL

在结果中,让我们假设total表返回一个数组,其中包含按列$find = People::find() ->where(['c_id' => $c_id]) ->orderBy('totals DESC, id DESC') ->asArray() ->all(); People total排序的以下数据集。

id

现在,如果你查看\yii\helpers\ArrayHelper,你会发现DESC

让我们在从查询中收到的数组上使用它,我假设您正在[ 0 => [ 'id' => 2 , 'c_id'=>2, 'name' => 'John' , 'age'=>18, 'totals'=>100, ], 1=>[ 'id'=>1, 'c_id'=>55, 'name'=>'Bob', 'age'=>20, 'totals'=>80, ], 2=>[ 'id'=>3, 'c_id'=>85, 'name'=>'Peter', 'age'=>15, 'totals'=>75, ] ]; 列中搜索ArrayHelper::getColumn(),因此我们将首先过滤掉$id列,如下所示

id

这将按以下顺序给出我们的ID,它与初始结果集的顺序相同。

id

然后让我们使用内置的$idsArray = ArrayHelper::getColumn($find, 'id');函数[2,1,3]

php

希望这就是你要找的东西。