PHP循环中使用unset无法移除指定数组元素,结果不符合预期
问题原因分析
你的代码没达到预期效果,核心问题是循环中动态计算数组长度导致遍历不完整,具体细节如下:
1. 循环提前终止,遗漏了"com"元素
你在for循环的条件里直接使用count($search_array),每次循环都会重新计算数组长度。而unset操作会直接修改原数组的长度和键名,导致循环提前结束:
- 初始数组长度为4,
i从0开始:- 当
i=0时,删除"https",数组长度变为3,数组键变为[1=>"www", 2=>"stackoverflow", 3=>"com"] - 当
i=1时,删除"www",数组长度变为2,数组键变为[2=>"stackoverflow", 3=>"com"] - 接下来
i自增到2,此时count($search_array)是2,i < 2不成立,循环直接结束,索引3的"com"根本没被遍历到,自然不会被删除。
- 当
2. 逻辑运算符的优先级隐患(非直接原因,但需注意)
虽然这次问题主要出在循环上,但你的条件判断里&&的优先级高于||,当前写法逻辑是对的,但如果后续修改条件,容易出现逻辑错误。建议给每个&&组合的条件加上括号,让逻辑更清晰:
if ( $search_array[$i] == null || (strtolower($search_array[$i]) == "http" && count($search_array) > 1) || (strtolower($search_array[$i]) == "https" && count($search_array) > 1) || (strtolower($search_array[$i]) == "www" && count($search_array) > 1) || (strtolower($search_array[$i]) == "com" && count($search_array) > 1) )
修复方案
方案一:提前缓存数组长度
把count($search_array)的结果提前存到变量里,避免循环中动态计算:
$search_array = array("https", "www", "stackoverflow", "com"); $length = count($search_array); // 提前缓存初始长度 for ($i=0; $i < $length; $i++) { if (!isset($search_array[$i])) continue; // 跳过已被删除的元素 $val = strtolower($search_array[$i]); if ( $search_array[$i] == null || ($val == "http" && $length > 1) || ($val == "https" && $length > 1) || ($val == "www" && $length > 1) || ($val == "com" && $length > 1) ) unset($search_array[$i]); } // 可选:重置数组索引为连续数字 $search_array = array_values($search_array); die(print_r($search_array));
方案二:使用foreach循环(更简洁)
foreach会遍历数组的所有元素,不受数组长度变化影响:
$search_array = array("https", "www", "stackoverflow", "com"); $length = count($search_array); foreach ($search_array as $key => $val) { $val = strtolower($val); if ( $val == null || ($val == "http" && $length > 1) || ($val == "https" && $length > 1) || ($val == "www" && $length > 1) || ($val == "com" && $length > 1) ) unset($search_array[$key]); } $search_array = array_values($search_array); die(print_r($search_array));
方案三:使用array_filter(最简洁)
用数组过滤函数直接筛选出需要保留的元素,代码更简洁:
$search_array = array("https", "www", "stackoverflow", "com"); $length = count($search_array); $search_array = array_filter($search_array, function($val) use ($length) { $val = strtolower($val); return !($val == null || ($val == "http" && $length > 1) || ($val == "https" && $length > 1) || ($val == "www" && $length > 1) || ($val == "com" && $length > 1) ); }); $search_array = array_values($search_array); die(print_r($search_array));
内容的提问来源于stack exchange,提问作者Natro90
相关产品推荐
相关产品推荐

