PHP循环中临时数组数据残留问题求助
解决PHP循环中$tempArray残留上一次数据的问题
嘿,我瞅你这问题太眼熟了!这典型的就是变量没有在循环内完全初始化导致的残留问题,咱们来拆解一下原因和解决办法:
问题根源
你提到第三次处理Tag ID时,明明$tkeys只有3个索引、for循环只执行3次,$tempArray却莫名带着上一个Tag的第四个元素——罪魁祸首是你用来排序的$sigsort数组没有在每次循环时清空!
你看,每次while循环里,你只初始化了$tempArray,但$sigsort是在第一次循环时创建的,之后就一直保留着之前的键值对:
- 前两次处理4个元素的Tag时,
$sigsort会被赋值0-3四个键; - 第三次处理3个元素的Tag时,
foreach只会给$sigsort赋值0-2三个键,上一次的sigsort[3]还留在数组里没被清空!
当你执行array_multisort($sigsort, SORT_DESC, $tempArray)时,PHP会尝试同步排序两个数组。这时候sigsort有4个元素,$tempArray只有3个,PHP会自动把$tempArray补全到和$sigsort相同的长度,补的就是上一次循环残留的第四个元素,这就出现了你看到的诡异现象!
修复代码
只需要在每次while循环开头,像初始化$tempArray一样初始化$sigsort即可:
while($currentTag = pg_fetch_assoc($tagList)) { $tkeys = array_keys(array_column($tagDataArray, 'devmac'), $currentTag['devmac']); $tempArray = array(); $sigsort = array(); // 关键:每次循环都重置排序用的数组 for($k=0; $k < count($tkeys); $k++){ array_push($tempArray, $tagDataArray[$tkeys[$k]]); } // 排序逻辑 foreach($tempArray as $sigkey => $sigrow) { $sigsort[$sigkey] = $sigrow['devrssi']; } array_multisort($sigsort, SORT_DESC, $tempArray); updateArticles($tempArray[0]); }
额外优化建议
其实你可以提前把$tagDataArray按devmac分组,避免每次循环都调用array_keys和array_column(这些都是O(n)的操作,重复执行会降低效率)。优化后的代码更简洁高效:
// 提前按devmac分组,只执行一次 $groupedByDevMac = []; foreach($tagDataArray as $item) { $devmac = $item['devmac']; if(!isset($groupedByDevMac[$devmac])) { $groupedByDevMac[$devmac] = []; } $groupedByDevMac[$devmac][] = $item; } // 循环处理每个Tag while($currentTag = pg_fetch_assoc($tagList)) { $devmac = $currentTag['devmac']; $tempArray = $groupedByDevMac[$devmac] ?? []; // 直接取出分组好的数据 $sigsort = []; foreach($tempArray as $sigkey => $sigrow) { $sigsort[$sigkey] = $sigrow['devrssi']; } array_multisort($sigsort, SORT_DESC, $tempArray); if(!empty($tempArray)) { // 增加空数组判断,避免报错 updateArticles($tempArray[0]); } }
内容的提问来源于stack exchange,提问作者T1960CT
相关产品推荐
相关产品推荐

