PHP 5.5 以下版本兼容 array_column() 函数的实现方案
由于 array_column 是 PHP 5.5 引入的新函数,在 PHP 5.4 或更低版本中调用会报错。为满足向下兼容需求,可以通过自定义同名函数作为 Polyfill 方案,在不改变业务代码的前提下恢复该功能。
实现原理与目标
array_column 的核心功能是提取多维数组中指定列的值,并可选择性地以另一列为新数组的键名。上述兼容代码通过遍历输入数组,结合 isset 和 current 等基础数组函数,完美复现了原生的行为逻辑,支持数值型键名与关联型键名的混合处理。
部署配置步骤
第1步:编写兼容性检测代码
目的:确保在当前服务器环境中,只有在 array_column 不存在时才加载此定义,避免函数重定义错误(Fatal Error)。
入口:项目的全局入口文件、公共函数库文件或 Bootstrap 文件中。
- 使用
function_exists('array_column')进行判断。 - 若返回
false,则执行自定义函数定义。
`php
if ( ! function_exists('array_column')) {
function array_column($input, $columnKey, $indexKey = NULL) {
// 判断列键是否为数字类型
$columnKeyIsNumber = (is_numeric($columnKey)) ? TRUE : FALSE;
// 判断索引键是否为空
$indexKeyIsNull = (is_null($indexKey)) ? TRUE : FALSE;
// 判断索引键是否为数字类型
$indexKeyIsNumber = (is_numeric($indexKey)) ? TRUE : FALSE;
$result = array();
foreach ((array)$input AS $key => $row) {
// 1. 获取需要的值
if ($columnKeyIsNumber) {
// 如果是数字索引,截取对应位置的值
$tmp = array_slice($row, $columnKey, 1);
$tmp = (is_array($tmp) && !empty($tmp)) ? current($tmp) : NULL;
} else {
// 如果是关联索引,直接获取键值
$tmp = isset($row[$columnKey]) ? $row[$columnKey] : NULL;
}
// 2. 设置结果数组的 Key
if ( ! $indexKeyIsNull) {
if ($indexKeyIsNumber) {
// 处理数字形式的索引键
$keyVal = array_slice($row, $indexKey, 1);
$keyVal = (is_array($keyVal) && ! empty($keyVal)) ? current($keyVal) : NULL;
$key = is_null($keyVal) ? 0 : $keyVal;
} else {
// 处理字符串形式的索引键
$key = isset($row[$indexKey]) ? $row[$indexKey] : 0;
}
} else {
// 未指定索引键时,保留原数组的索引顺序
$key = is_null($indexKey) ? $key : $key;
}
$result[$key] = $tmp;
}
return $result;
}
}
`
第2步:验证兼容性功能
目的:确认代码生效且返回结构与 PHP 原生 array_column 一致。
操作:在一个低版本的 PHP 环境或本地测试脚本中执行以下代码:
$a = array(
array(
'id' => 5698,
'first_name' => 'Bill',
'last_name' => 'Gates',
),
array(
'id' => 4767,
'first_name' => 'Steve',
'last_name' => 'Aab',
),
);
$first_names = array_column($a, 'first_name'); // 仅获取 first_name
$named_list = array_column($a, 'first_name', 'id'); // 以 id 为键
完成状态:变量 $first_names 应输出包含名字的数组,$named_list 应以 ID 为键指向名字。无报错即为成功。
注意事项
- 性能差异:原生 C 语言实现的
array_column速度更快。此方案主要用于向兼容,建议在可能升级的环境中使用原生函数。 - 默认 Key 处理:原代码中当
$indexKeyIsNull为真但未进入特定分支时,保留了外层的$key,这保证了在无第二参数时行为等同于原声函数。
总结
通过在项目中加入上述 if (!function_exists)array_column 导致的问题。以上就是自己写的兼容低于PHP 5.5版本的array_column()函数的详细内容,更多关于PHP数组处理优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









