PHP 5.5 以下版本兼容 array_column() 函数的实现方案

巷口听风
巷口听风
发布时间:2026-10-14 | 5人浏览过
原创

由于 array_column 是 PHP 5.5 引入的新函数,在 PHP 5.4 或更低版本中调用会报错。为满足向下兼容需求,可以通过自定义同名函数作为 Polyfill 方案,在不改变业务代码的前提下恢复该功能。

实现原理与目标

array_column 的核心功能是提取多维数组中指定列的值,并可选择性地以另一列为新数组的键名。上述兼容代码通过遍历输入数组,结合 isset 和 current 等基础数组函数,完美复现了原生的行为逻辑,支持数值型键名与关联型键名的混合处理。

部署配置步骤

第1步:编写兼容性检测代码

目的:确保在当前服务器环境中,只有在 array_column 不存在时才加载此定义,避免函数重定义错误(Fatal Error)。

入口:项目的全局入口文件、公共函数库文件或 Bootstrap 文件中。

  1. 使用 function_exists('array_column') 进行判断。
  2. 若返回 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数组处理优化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表