PHP parse_url返回数组数字索引访问报Undefined Offset的原因及解决
问题原因
parse_url()默认返回关联数组,键名是scheme/host这类字符串,不存在0~7的数字索引,所以直接用数字下标访问会触发Undefined offset报错。- foreach遍历不需要关心键名类型,会按顺序读取数组所有值,所以可以正常运行。
解决方案
要支持数字索引访问,只需要在拿到parse_url返回结果后,添加一行代码将关联数组转换为索引数组即可:
$url_properties = array_values($url_properties);
完整示例代码
<?php $url = 'http://user:password@domain.com/path.php?query_string=value#fragment1'; $url_properties = parse_url($url); // 转换为数字索引数组,顺序和parse_url返回的关联数组顺序一致,刚好对应你预期的0~7的属性顺序 $url_properties = array_values($url_properties); echo $url_properties[0]; // 输出http echo $url_properties[1]; // 输出domain.com echo $url_properties[2]; // 输出空(当前URL无port属性) echo $url_properties[3]; // 输出user echo $url_properties[4]; // 输出password echo $url_properties[5]; // 输出/path.php echo $url_properties[6]; // 输出query_string=value echo $url_properties[7]; // 输出fragment1 ?>
适配缺省属性的场景
如果需要固定8个索引位置,避免部分URL缺少属性导致后续索引前移,可添加补全逻辑:
<?php $url = 'http://user:password@domain.com/path.php?query_string=value#fragment1'; // 固定属性顺序 $fixed_keys = ['scheme','host','port','user','pass','path','query','fragment']; $url_properties = parse_url($url); // 补全不存在的属性,值设为空字符串 foreach($fixed_keys as $key){ if(!isset($url_properties[$key])){ $url_properties[$key] = ''; } } // 转换为数字索引数组 $url_properties = array_values($url_properties); ?>
内容的提问来源于stack exchange,提问作者Nut Cracking Dude
相关产品推荐
相关产品推荐

