PHP中如何基于值获取两个数组的差异?(附示例问题)
解决数组时间值差异对比的问题
嘿,我来帮你搞定这个问题!你遇到的情况主要有两个核心原因:
1. array_diff_assoc() 不是你需要的函数
array_diff_assoc() 会同时比较数组的键和值,只有当键和值都完全匹配时,才会认为两个元素是相同的。你的两个数组键完全不对应(比如array1里的"11:00 am"在键3,array2里的"11:00 am"在键4),再加上时间字符串格式不一致,自然会返回整个array2。你需要的是只对比值的差异,应该用array_diff(),不过还要先解决第二个问题。
2. 时间字符串格式不统一
"8:00 am" 和 "08:00 am" 是字面量不同的字符串,即使它们代表同一个时间,PHP也会把它们当成不同的值。所以第一步要把两个数组的时间字符串转换成统一格式,再做对比。
具体实现代码
首先写一个时间格式化函数,把所有时间转换成统一的带前导零的12小时制格式:
function standardizeTime($timeStr) { $time = DateTime::createFromFormat('h:i a', $timeStr); // 解析成功就返回标准化格式,失败则返回原字符串(处理异常情况) return $time ? $time->format('h:i a') : $timeStr; }
然后处理数组并对比差异:
$array1 = ["8:00 am","8:30 am","10:00 am","11:00 am","11:45 am","1:30 pm","2:30 pm","3:30 pm","4:15 pm", "8:00 am","8:30 am","10:15 am","11:30 am","1:00 pm","2:30 pm","3:45 pm","8:00 am"]; $array2 = ["08:00 am","08:45 am","09:30 am","10:15 am","11:00 am","11:45 am","12:30 pm","01:15 pm", "02:00 pm", "02:45 pm","03:30 pm","04:15 pm","05:00 pm"]; // 标准化两个数组的时间格式 $stdArray1 = array_map('standardizeTime', $array1); $stdArray2 = array_map('standardizeTime', $array2); // 获取array2中不存在于array1的值 $diffFromArray2 = array_diff($stdArray2, $stdArray1); // 如果需要保留array2中的原始时间字符串(而不是标准化后的),可以这样做: $originalDiff = []; foreach ($array2 as $time) { if (!in_array(standardizeTime($time), $stdArray1)) { $originalDiff[] = $time; } } // 输出结果 var_dump($diffFromArray2); var_dump($originalDiff);
结果说明
$diffFromArray2会返回标准化后,array2中不在array1里的时间值:array(7) { [1]=> string(8) "08:45 am" [2]=> string(8) "09:30 am" [6]=> string(8) "12:30 pm" [7]=> string(8) "01:15 pm" [8]=> string(8) "02:00 pm" [9]=> string(8) "02:45 pm" [12]=> string(8) "05:00 pm" }$originalDiff则保留了array2中的原始字符串格式,结果和上面一致只是值是原始的。
如果需要双向差异(即array1中不在array2的,加上array2中不在array1的),可以用:
$bidirectionalDiff = array_merge(array_diff($stdArray1, $stdArray2), array_diff($stdArray2, $stdArray1));
内容的提问来源于stack exchange,提问作者user14289833
相关产品推荐
相关产品推荐

