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

PHP多维数组:保留首个索引唯一且次索引值最小的元素

处理PHP多维数组:筛选首个索引唯一且次索引最小的元素

嘿,这个需求其实挺常见的,我来给你捋捋怎么实现。核心思路就是先跟踪每个唯一首个索引对应的最小次索引值,再把结果转换成你需要的二维数组格式。

方法一:分步遍历实现

这是最直观的方式,容易理解和调试:

// 你的示例数据
$data = array ( array(1, 9), array(1, 3), array(1, 5), array(9, 2), array(9, 7), );

// 临时数组,用来存储每个首个索引对应的最小次索引
$tempMap = [];

// 第一步:遍历原数组,记录最小值
foreach ($data as $item) {
    $firstIndex = $item[0];
    $secondIndex = $item[1];
    
    // 如果该首个索引未记录,或者当前次索引更小,就更新
    if (!isset($tempMap[$firstIndex]) || $secondIndex < $tempMap[$firstIndex]) {
        $tempMap[$firstIndex] = $secondIndex;
    }
}

// 第二步:把临时关联数组转成目标二维数组格式
$result = [];
foreach ($tempMap as $key => $value) {
    $result[] = [$key, $value];
}

// 输出结果
print_r($result);

运行这段代码后,得到的$result就是你期望的:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 3
        )

    [1] => Array
        (
            [0] => 9
            [1] => 2
        )

)

方法二:用array_reduce简化代码

如果你喜欢更简洁的写法,可以用array_reduce来一步完成临时数组的构建,再结合array_map转换格式:

$data = array ( array(1, 9), array(1, 3), array(1, 5), array(9, 2), array(9, 7), );

// 用array_reduce生成首个索引到最小次索引的映射
$tempMap = array_reduce($data, function($carry, $item) {
    $firstIndex = $item[0];
    if (!isset($carry[$firstIndex]) || $item[1] < $carry[$firstIndex]) {
        $carry[$firstIndex] = $item[1];
    }
    return $carry;
}, []);

// 转换为目标格式
$result = array_map(function($key, $value) {
    return [$key, $value];
}, array_keys($tempMap), $tempMap);

print_r($result);

逻辑说明

两种方法的核心逻辑都是一致的:

  1. 以子数组的首个元素作为唯一标识(键),遍历过程中只保留该键对应的最小次元素值。
  2. 最后把关联数组的键值对重新包装成二维数组,就得到了你要的结果。

这样处理不仅高效(只需要遍历原数组一次,再遍历一次临时数组),而且逻辑清晰,不管原数组多大都能稳定运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:43:14