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

动态填充数组中in_array函数无法正常工作的问题排查

解决in_array处理sqlsrv动态填充数组失效的问题

嗨,我之前刚好碰到过一模一样的问题!核心原因是sqlsrv从数据库返回的holidayDate并不是你以为的字符串格式日期,而是PHP DateTime对象——这就导致你用普通字符串去调用in_array的时候根本匹配不到。

先验证问题

你可以在填充数组的循环里加一行调试代码,确认数据类型:

while( $rowsHol = sqlsrv_fetch_array( $stmtHol, SQLSRV_FETCH_ASSOC) ) {
    var_dump($rowsHol['holidayDate']); // 会输出类似object(DateTime)#1 (3) { ... }的内容
    $holidays[] = $rowsHol['holidayDate'];
}

看到这个结果就实锤了:数组里存的是DateTime实例,不是字符串。

三种解决方案

方案1:填充数组时将DateTime转为字符串

这是最直接的方式,根据你后续匹配的日期格式,用DateTime::format()把对象转成字符串:

while( $rowsHol = sqlsrv_fetch_array( $stmtHol, SQLSRV_FETCH_ASSOC) ) {
    // 这里用Y-m-d格式,和你要匹配的字符串格式保持一致,比如'2024-05-01'
    $holidays[] = $rowsHol['holidayDate']->format('Y-m-d');
}

之后调用in_array时,直接用对应格式的字符串匹配即可:

$checkDate = '2024-05-01';
if (in_array($checkDate, $holidays)) {
    // 匹配成功,执行逻辑
}

方案2:严格匹配DateTime对象

如果你需要保留数组里的DateTime对象(比如后续还要做日期运算),可以在in_array里开启严格类型匹配(第三个参数传true),同时确保你要匹配的目标也是DateTime对象:

// 先把要检查的日期转为DateTime对象
$checkDate = new DateTime('2024-05-01');
// 开启严格匹配
if (in_array($checkDate, $holidays, true)) {
    // 匹配成功
}

方案3:修改sqlsrv连接选项,直接返回字符串日期

在建立数据库连接的时候,添加ReturnDatesAsStrings选项,让sqlsrv直接把日期返回成字符串,这样原代码完全不用修改:

$connOptions = array(
    'Database' => '你的数据库名',
    'Uid' => '用户名',
    'PWD' => '密码',
    'ReturnDatesAsStrings' => true // 关键选项:日期直接返回字符串
);
$conn = sqlsrv_connect($serverName, $connOptions);

之后你的$holidays数组里就会直接存字符串日期,in_array就能正常工作了。

注意事项

  • 如果数据库里的日期包含时间部分(比如2024-05-01 10:00:00),转字符串的时候要带上时间格式,比如format('Y-m-d H:i:s'),否则会因为格式不匹配导致in_array失效。
  • 严格匹配时,两个DateTime对象的时间戳必须完全一致,哪怕差一秒都匹配不到。

内容的提问来源于stack exchange,提问作者Charles D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:06:21