如何调试PHP array_multisort的「数组大小不一致」警告?
解决array_multisort()的「Array sizes are inconsistent」警告问题
一、从根源避免警告:确保数组大小一致
你之前的检查未生效,大概率是因为$data中混入了非数组元素,导致array_column生成的列数组长度与$data不一致。比如$data里存在null或字符串类型的元素时,array_column会直接跳过这类元素,生成的列数组长度就会短于$data——哪怕三个列数组长度一致,只要和$data长度不匹配,依然会触发警告。
正确的处理步骤:
- 先过滤
$data,仅保留数组类型的有效元素:
// 过滤掉非数组的无效条目 $data = array_filter($data, 'is_array');
- 提取列数据后,检查所有参与排序的数组(包括
$data)长度是否完全一致:
$columns_1 = array_column($data, 'col1'); $columns_2 = array_column($data, 'col2'); $columns_3 = array_column($data, 'col3'); $totalCount = count($data); if ($totalCount === count($columns_1) && $totalCount === count($columns_2) && $totalCount === count($columns_3)) { array_multisort($columns_1, SORT_ASC, $columns_2, SORT_ASC, $columns_3, SORT_ASC, $data); } else { // 记录异常日志或执行降级逻辑 error_log('数据数组大小不一致,跳过排序操作'); }
如果需要更严格的校验(要求每个元素必须包含col1、col2、col3三个键),可以修改过滤规则:
$data = array_filter($data, function($item) { return is_array($item) && isset($item['col1'], $item['col2'], $item['col3']); });
二、捕获array_multisort的警告(应急方案)
如果无法提前完全规避数据异常,可以通过临时注册错误处理函数捕获该特定警告,阻止其写入日志或执行后续处理:
// 初始化警告存储变量 $sortWarning = null; // 临时注册错误处理逻辑,匹配目标警告 set_error_handler(function($errno, $errstr) use (&$sortWarning) { if ($errno === E_WARNING && strpos($errstr, 'Array sizes are inconsistent') !== false) { $sortWarning = $errstr; return true; // 阻止警告默认输出到日志 } return false; // 其他错误按原有逻辑处理 }); // 执行排序操作 array_multisort($columns_1, SORT_ASC, $columns_2, SORT_ASC, $columns_3, SORT_ASC, $data); // 恢复系统原错误处理机制 restore_error_handler(); // 检查捕获结果,执行后续处理 if ($sortWarning) { error_log('排序触发警告:' . $sortWarning); // 这里可选择放弃使用排序后的$data,或执行降级逻辑 }
注意:捕获警告只是应急手段,优先推荐从根源上确保数组一致性,避免触发警告。
内容的提问来源于stack exchange,提问作者Eydun
相关产品推荐
相关产品推荐

