php如何定义数组_php定义数组多种格式用法【实例】

PHP 5.4+ 推荐用[]而非array(),二者行为一致但[]更简洁、解析快、类型推断好;需警惕键名隐式转换(如'08'→8)和多维追加时中间层未初始化的隐患。

PHP 中 array() 函数和方括号语法的区别

PHP 5.4+ 开始,[] 是定义数组的首选写法,比 array() 更简洁、解析更快,且语义更清晰。老版本(如 PHP 5.3)必须用 array(),但如今已基本无需兼容。

两者行为完全一致,但混用容易引发维护困惑。例如以下写法虽合法,但不推荐:

$a = array('a' => 1, 'b' => array(2, 3));
$b = ['c' => 4, 'd' => [5, 6]];
  • array() 在 PHP 8.0+ 中已被标记为“语法糖”,无运行时开销,但视觉上更冗长
  • 嵌套数组中统一用 [] 可减少括号层级混乱,尤其在 JSON-like 结构里
  • IDE 和静态分析工具(如 PHPStan)对 [] 的类型推断支持更好

关联数组键名的隐式转换规则

PHP 会自动把某些字符串键转为整型,导致意外覆盖。比如 '08''0x10''1e2' 这类看似字符串的 key,实际会被当作数字处理。

$arr = [
    '08' => 'octal?',     // 实际变成 int(8) → 键为 8
    '0x10' => 'hex?',     // 转为 int(16)
    '1e2' => 'float?',    // 转为 float(100),再转为 int(100)
];
  • var_dump(array_keys($arr)) 可验证键是否被转换
  • 若需保留原始字符串形式,务必加引号且避免数字开头的字符串(如改用 'id_08'
  • 从 JSON 解码来的数据(json_decode($json, true))默认生成关联数组,其键始

    终为字符串,不受此影响

空数组声明与初始化的常见误操作

直接赋值 = [] 是最安全的方式;用 array()new ArrayObject() 属于过度设计,除非有特殊需求。

  • 不要写 $arr = array(); $arr[] = 'x'; —— 多一次函数调用,无必要
  • 避免 $arr = null; $arr[] = 'x'; —— 触发 Notice:“Cannot use a scalar value as an array”
  • 函数返回可能为空时,应显式判断:if (is_array($data) && !empty($data)) { ... },而非直接 foreach($data as ...)
  • PHP 7.1+ 支持空合并运算符简化初始化:$items = $input['list'] ?? [];

多维数组动态追加元素的陷阱

[] 向深层嵌套数组追加时,PHP 不会自动创建中间层级。例如 $arr['user']['posts'][] = $post;$arr['user'] 未定义时会报 Warning。

  • 正确做法是提前初始化或使用 ??=(PHP 7.4+):($arr['user']['posts'] ??= [])[] = $post;
  • 传统兼容写法:if (!isset($arr['user']['posts'])) $arr['user']['posts'] = [];
  • ArrayObject 或封装工具类可规避,但增加了复杂度,小项目不值得
  • 注意 array_push()[] 效率差异:后者更快,且支持多值一次性追加($arr[] = $a; $arr[] = $b;
实际开发中,最易忽略的是键名隐式转换和多维追加时的中间层缺失——这两个问题不会立刻报错,但会在数据逻辑中埋下难以调试的隐患。