array_flip 会交换数组键值,但要求原值为整型或字符串,否则报错或返回 null;重复值导致后键覆盖前键;浮点数和布尔值会被强制转换引发冲突;非数组参数需先用 is_array() 校验。

array_flip 会把数组的键和值互换,但只适用于值能作为合法键的情况——也就是值必须是 integer 或 string 类型,且不能是 null、array、object、resource 等不支持做键的数据。
值类型不合法导致警告或静默失败
如果原数组中有非标量值(比如数组、对象),array_flip 会触发 Warning 并返回 null。例如:
php$arr = ['a' => 1, 'b' => []];
var_dump(array_flip($arr)); // Warning: array_flip(): Can only flip STRING and INTEGER values!
?>
注意:PHP 8.0+ 对非法值更严格,7.x 可能只报 warning 但部分元素被丢弃;务必检查返回值是否为 array,避免后续逻辑出错。
重复值导致数据丢失
原数组中若存在相同值,后出现的键会覆盖先出现的键,因为键必须唯一。例如:
立即学习“PHP免费学习笔记(深入)”;
程序介绍:程序采用.net 2.0进行开发,全自动应用淘客api,自动采集信息,无需,手工更新,源码完全开放。(程序改进 无需填入阿里妈妈淘客API 您只要修改app_code文件下的config.cs文件中的id为你的淘客id即可)针对淘客3/300毫秒的查询限制,系统采用相应的解决方案,可以解决大部分因此限制带来的问题;程序采用全局异常,避免偶尔没考虑到的异常带来的问题;程序源码全部开放,请使
$arr = ['x' => 'cat', 'y' => 'dog', 'z' => 'cat'];
$flipped = array_flip($arr);
// 结果:['cat' => 'z', 'dog' => 'y'] —— 'x' 被覆盖了
?>
如需保留所有映射关系,不能直接用 array_flip,可改用循环手动构建多维结构:
- 遍历原数组,用值作新键,将旧键推入对应数组
- 或用 array_reduce + isset 判断是否已存在,再决定追加还是初始化
浮点数和布尔值会被强制转换
PHP 数组键对类型敏感但有隐式转换规则:
- false 会转成 0,true 转成 1
- float 如 1.0、2.0 会被转为 int(1、2),而 1.5 会截断为 1
- 字符串数字如 "1" 和整数 1 在作为键时等价,互换后可能合并
这意味着:array_flip(['a' => 1.0, 'b' => '1']) 最终只保留一个键 1,另一个被覆盖。
空数组或非数组参数行为
array_flip 要求传入数组,否则会报 warning 并返回 null。常见误用:
- 传入 null、false、string 等非数组类型
- 函数返回 false(如 json_decode 失败未校验)直接传给 array_flip
安全做法是先用 is_array() 判断,再调用:
$data = json_decode($json, true);
if (is_array($data)) {
$result = array_flip($data);
} else {
$result = [];
}
?>










