如何筛选关联数组中的峰值元素?索引数组方法无法适配
解决关联数组的峰值元素筛选问题
我来帮你搞定这个关联数组的峰值筛选需求!你之前找到的函数只适用于索引数组,而且没考虑末尾元素的规则,我给你调整一下逻辑,完美适配关联数组:
完整解决方案代码
$array = array('a' => 0, 'b' => 2, 'c' => 1, 'd' => 2, 'e' => 3); $keys = array_keys($array); $totalKeys = count($keys); $result = array_filter($array, function($value, $key) use($array, $keys, $totalKeys) { $currentIndex = array_search($key, $keys); // 跳过第一个元素(题目未要求判断开头元素) if ($currentIndex === 0) { return false; } // 处理末尾元素:只需大于前一个元素 if ($currentIndex === $totalKeys - 1) { $prevKey = $keys[$currentIndex - 1]; return $value > $array[$prevKey]; } // 处理中间元素:需同时大于前后元素 $prevKey = $keys[$currentIndex - 1]; $nextKey = $keys[$currentIndex + 1]; return $value > $array[$prevKey] && $value > $array[$nextKey]; }, ARRAY_FILTER_USE_BOTH); // 输出结果:Array ( [b] => 2 [e] => 3 ) print_r($result);
代码逻辑说明
为什么这个代码能适配关联数组?核心是先提取数组的键列表,不管你的键是字符串还是数字,都能通过键列表的索引来定位前后元素:
- 第一步用
array_keys()拿到所有键的有序列表,这样可以通过索引找到当前键的前一个和后一个键 - 在回调函数里,分三种情况处理:
- 第一个元素:题目没要求判断开头元素,直接排除
- 末尾元素:只需要和前一个元素的值对比,满足大于的条件就保留
- 中间元素:同时和前后两个元素的值对比,都大于才保留
和原函数的区别
你之前的函数有两个明显问题:
- 依赖索引数组的数字键,用
$k+1来取后一个元素,关联数组的键是字符串,这种方式完全失效 - 没有处理末尾元素的判断逻辑,漏掉了像
e => 3这种符合条件的末尾峰值
用上面的代码跑你给的示例输入,就能得到你期望的输出啦!
内容的提问来源于stack exchange,提问作者SVL
相关产品推荐
相关产品推荐

