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
相关产品推荐
相关产品推荐

