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);
逻辑说明
两种方法的核心逻辑都是一致的:
- 以子数组的首个元素作为唯一标识(键),遍历过程中只保留该键对应的最小次元素值。
- 最后把关联数组的键值对重新包装成二维数组,就得到了你要的结果。
这样处理不仅高效(只需要遍历原数组一次,再遍历一次临时数组),而且逻辑清晰,不管原数组多大都能稳定运行。
内容的提问来源于stack exchange,提问作者AZee
相关产品推荐
相关产品推荐

