如何在 PHP 中通过索引访问关联数组的元素

php 关联数组默认不支持直接用数字索引(如 `$arr[0]`)访问,但可通过 `array_values()` 提取值序列后实现按序索引访问。

在 PHP 中,关联数组(如 ["name" => "John", "age" => 33])的键是字符串,其内部存储虽保持插入顺序(自 PHP 7.4 起严格保证),但语法上不支持 $marr[0] 这类数字下标访问——这会触发 Undefined offset: 0 错误,因为 PHP 不会自动将键名映射为整数索引。

要实现“按插入顺序获取第 N 个值”,正确做法是先用 array_values() 提取纯数值索引数组,再通过数字下标访问:

$marr = [
    "name" => "John",
    "age"  => 33
];

// 安全获取第一个值("John")
$value = array_values($marr)[0];
echo $value; // 输出:John

// 获取第二个值(33)
$value2 = array_values($marr)[1];
echo $value2; // 输出:33

关键说明

  • array_values() 返回一个数组,其键被重置为从 0 开始的连续整数,值顺序与原数组插入顺序完全一致(PHP 官方文档明确保证此行为);
  • 该方法适用于只关心值顺序、无需原始键名的场景;
  • 若需同时获取键和值,可结合 array_keys() 使用:
    $keys = array_keys($marr);   // ["name", "age"]
    $values = array_values($marr); // ["John", 33]
    echo $keys[0] . ': ' . $values[0]; // name: John

⚠️ 注意事项

  • 避免在循环中反复调用 array_values($marr)[i] —— 每次都会重建数组,影响性能;建议先缓存结果:
    $vals = array_values($marr);
    for ($i = 0; $i < count($vals); $i++) {
        echo $vals[$i] . "\n";
    }
  • 若数组可能为空,务必检查索引有效性,防止越界:
    $vals = array_values($marr);
    if (!empty($vals)) {
        echo $vals[0];
    }

总结:PHP 关联数组本身无内置数字索引,但 array_values() 是标准、可靠且语义清晰的解决方案,兼顾可读性与兼容性(支持 PHP 4.0+)。