动态填充数组中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
相关产品推荐
相关产品推荐

