如何在PHP中实现基于stdClass对象数组的多条件搜索?
实现支持多条件的stdClass数组搜索函数
没问题,我来帮你搞定这个多条件搜索的函数!你的单条件搜索逻辑已经很清晰了,我们只需要在此基础上扩展,让函数能接收一组键值对形式的条件,并且只有当所有条件都匹配时才返回对应的对象。
多条件搜索函数实现
public function RechercheEnregistrementsMultiCriteres($criteres) { $retour = array(); $datas = $this->ToutEnregistrement(); foreach ($datas as $row) { // 默认假设当前行匹配所有条件,直到发现不匹配项 $matchTousCriteres = true; foreach ($criteres as $champ => $critere) { // 先检查对象是否有这个字段,避免报错(可选但更健壮) if (!property_exists($row, $champ) || $row->$champ != $critere) { $matchTousCriteres = false; break; // 只要一个条件不满足,直接跳出循环省时间 } } if ($matchTousCriteres) { $retour[] = $row; } } return $retour; }
关键逻辑说明
- 函数接收的
$criteres是关联数组,比如['Type' => 'Creation', 'Annee' => '2018'],键对应stdClass对象的字段名,值是要匹配的内容 - 加入
property_exists是个小保险:如果你的数据里偶尔有某个对象缺失某个字段,这步能避免PHP报错;要是你能保证所有数据结构完全一致,这步可以删掉 - 用
$matchTousCriteres标志位跟踪匹配状态,一旦发现不匹配就立刻终止当前条件的检查,提升遍历效率
调用示例
比如你要找「类型为Creation且年份为2018」的记录,就这么用:
$mesCriteres = [ 'Type' => 'Creation', 'Annee' => '2018' ]; $resultats = $votreClasseInstance->RechercheEnregistrementsMultiCriteres($mesCriteres);
可选扩展思路
如果之后需要更灵活的搜索,还可以这么改:
- 或条件匹配:把
$matchTousCriteres初始化为false,只要有一个条件匹配就设为true并跳出循环 - 模糊搜索:把
!=改成!str_contains($row->$champ, $critere)(PHP 8+),或者strpos($row->$champ, $critere) === false - 多操作支持:把条件改成
['Mois' => ['>', '02']]的形式,在循环里判断操作符执行对应比较(比如>、<、>=等)
内容的提问来源于stack exchange,提问作者Feuxxx
相关产品推荐
相关产品推荐

