You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选关联数组中的峰值元素?索引数组方法无法适配

解决关联数组的峰值元素筛选问题

我来帮你搞定这个关联数组的峰值筛选需求!你之前找到的函数只适用于索引数组,而且没考虑末尾元素的规则,我给你调整一下逻辑,完美适配关联数组:

完整解决方案代码

$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()拿到所有键的有序列表,这样可以通过索引找到当前键的前一个和后一个键
  • 在回调函数里,分三种情况处理:
    • 第一个元素:题目没要求判断开头元素,直接排除
    • 末尾元素:只需要和前一个元素的值对比,满足大于的条件就保留
    • 中间元素:同时和前后两个元素的值对比,都大于才保留

和原函数的区别

你之前的函数有两个明显问题:

  1. 依赖索引数组的数字键,用$k+1来取后一个元素,关联数组的键是字符串,这种方式完全失效
  2. 没有处理末尾元素的判断逻辑,漏掉了像e => 3这种符合条件的末尾峰值

用上面的代码跑你给的示例输入,就能得到你期望的输出啦!

内容的提问来源于stack exchange,提问作者SVL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:19:28