PHP实现保留相同time元素中最小amount项的方法求助
问题:保留多维数组中同time下amount最小的元素
我有如下多维数组,希望删除所有time值相同的元素,仅保留其中amount值最小的元素。我了解sort函数,但不清楚如何实现元素删除逻辑。
示例数组
array( array( "hash" => 0x111, "sender" => 0x11111, "amount" => 0.015, "time" => 1683896236 ), array( "hash" => 0x222, "sender" => 0x22222, "amount" => 0.055, "time" => 1683896236 ), array( "hash" => 0x333, "sender" => 0x33333, "amount" => 0.075, "time" => 1683896236 ), array( "hash" => 0x444, "sender" => 0x44444, "amount" => 0.6666, "time" => 1683896237 ) )
我尝试的代码
$this_array = explode("\n", $this_str); $keep_array = array(); foreach($this_array as $ta) { $break = explode("###", $ta); $this_hash = $break[0]; $this_sender = $break[1]; $this_amount = $break[2]; $this_time = $break[3]; if (!array_key_exists($this_time, $keep_array)) { echo "This time $this_time does not exist \n"; $keep_array[$this_time] = $this_amount; } else { if ($this_amount < $keep_array[$this_time]) { echo "This time $this_time exist \n"; $keep_array[$this_time] == $this_amount; } } } print_r($keep_array);
得到的结果不符合预期,且更新测试数据后,相同time值的元素仍有多个保留。我需要解决:
- 找出所有time值相同的数组元素
- 比较它们的amount值,仅保留同time中amount最小的元素
- 删除同time中amount较大的元素
解决方案
问题分析
你当前代码存在几个关键问题:
- 仅存储了
amount值,没有保留完整的数组元素,无法得到包含hash、sender等信息的结果 - 赋值时错误使用了比较运算符
==,应该用赋值运算符= - 处理的是字符串分割后的数组,而非原始的多维数组结构
正确实现代码
// 假设原始多维数组为$originalArray $originalArray = array( array( "hash" => 0x111, "sender" => 0x11111, "amount" => 0.015, "time" => 1683896236 ), array( "hash" => 0x222, "sender" => 0x22222, "amount" => 0.055, "time" => 1683896236 ), array( "hash" => 0x333, "sender" => 0x33333, "amount" => 0.075, "time" => 1683896236 ), array( "hash" => 0x444, "sender" => 0x44444, "amount" => 0.6666, "time" => 1683896237 ) ); $result = array(); foreach ($originalArray as $item) { $time = $item['time']; // 如果当前time未记录,直接存入完整元素 if (!isset($result[$time])) { $result[$time] = $item; } else { // 比较amount,保留更小的元素 if ($item['amount'] < $result[$time]['amount']) { $result[$time] = $item; } } } // 重新索引数组,去掉time作为键的结构 $finalArray = array_values($result); print_r($finalArray);
逻辑说明
- 以
time为键创建临时数组$result,用于存储每个time对应的最小amount元素 - 遍历原始数组,若当前time未在临时数组中,直接存入完整元素
- 若time已存在,比较当前元素与临时数组中对应元素的
amount,保留更小的那个 - 最后用
array_values()重置数组索引,得到符合预期的多维数组结果
内容的提问来源于stack exchange,提问作者Zack D
相关产品推荐
相关产品推荐

