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

如何在PHP关联数组中获取每个元素的前、后非空相邻值

你提到的逐个遍历全数组(即每个元素单独向前/向后搜索非空值)的方案时间复杂度为O(n²),确实在数据量大时效率很低。我们可以用两次线性遍历实现O(n)时间复杂度的最优方案,具体如下:


实现逻辑

  • 生成前序非空数组:从左到右遍历原数组,维护一个变量记录最近遇到的非空值,每个位置直接存储该变量即可;如果当前元素为非空,就更新这个变量。初始值设为空字符串,匹配首元素无前序的规则。
  • 生成后序非空数组:从右到左遍历原数组,同样维护一个变量记录最近遇到的非空值,每个位置直接存储该变量即可;如果当前元素为非空,就更新这个变量。初始值设为空字符串,匹配末元素无后续的规则。

代码实现

// 原数组
$a = array("1" => "a", "2" => "", "3" => "", "4" => "f", "5" => "d", "6" => "c");

// 若原数组索引不是升序排列,先按键排序保证遍历顺序正确
ksort($a);
$keys = array_keys($a);
$length = count($keys);

// 生成前一个非空元素数组$p
$p = [];
$lastNonEmpty = "";
foreach ($keys as $key) {
    $p[$key] = $lastNonEmpty;
    if ($a[$key] !== "") {
        $lastNonEmpty = $a[$key];
    }
}

// 生成后一个非空元素数组$n
$n = [];
$nextNonEmpty = "";
for ($i = $length - 1; $i >= 0; $i--) {
    $key = $keys[$i];
    $n[$key] = $nextNonEmpty;
    if ($a[$key] !== "") {
        $nextNonEmpty = $a[$key];
    }
}

效率说明

该方案仅需要对数组做两次完整遍历,时间复杂度为O(n),空间复杂度为O(n),是该场景下的最优实现,数组元素量越大,相比O(n²)的暴力搜索方案效率优势越明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:09:02