You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:00:55