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

PHP保留二维数组中子数组前三高值(排除必存的1)

问题描述

我有一个包含83个子数组的二维数组(已分割为83块),需要保留每个子数组中的三个最高值。所有数值范围在-1到1之间,且每个子数组中必有一个值为1,该值不计入前三高值。

数组示例:

Array
(
    [0] => Array
        (
            [1] => 0.5278533158407
            [2] => 0.4080014506744
            [3] => 0.5086879008467
            [5] => 0.3950042642736
            [6] => 1
        )
    [1] => Array
        (
            [1] => 1
            [2] => 0.52873390443395
            [3] => 0.52518076782133
            [4] => 0.52983621494599
            [5] => 0.54392829322042
            [6] => 0.53636363636364
        )
    // ... 剩余子数组
)

尝试的无效代码:

for ($i = 0; $i < sizeof($list_chunk); $i++) {
    arsort($list_chunk[$i]);
}

for ($i = 0; $i < sizeof($list_chunk); $i++) {
    array_slice($list_chunk[$i],1,3,true);
}

print("<pre>");
print_r($list_chunk);
print("</pre>");
解决方案

你这段代码的核心问题是array_slice执行后没有把结果赋值回原数组,所以原数组完全没被修改。另外可以把两个循环合并,代码更简洁高效。

修正后的代码:

foreach ($list_chunk as &$subArray) {
    // 按值降序排序,保留原键名
    arsort($subArray);
    // 跳过第一个值(必为1),取接下来的3个元素,覆盖原数组
    $subArray = array_slice($subArray, 1, 3, true);
}
unset($subArray); // 释放引用,避免后续操作意外改动数组

print("<pre>");
print_r($list_chunk);
print("</pre>");

关键说明:

  • 用foreach遍历并引用子数组,比手动索引计数更安全简洁
  • arsort排序后,子数组第一个元素肯定是1(因为所有值≤1且必有一个1),直接跳过即可
  • array_slice的true参数会保留原键名,最后一定要把切片结果赋值回$subArray,这样原二维数组才会被更新
  • 遍历结束后unset($subArray)是必要的,防止后续代码误操作这个引用变量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:50:21