我有以下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 +结果查询中是一个很好的方法。
反正有加速吗?
答案 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
希望这就是你要找的东西。