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

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较大的元素

解决方案

问题分析

你当前代码存在几个关键问题:

  1. 仅存储了amount值,没有保留完整的数组元素,无法得到包含hash、sender等信息的结果
  2. 赋值时错误使用了比较运算符==,应该用赋值运算符=
  3. 处理的是字符串分割后的数组,而非原始的多维数组结构

正确实现代码

// 假设原始多维数组为$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);

逻辑说明

  1. 以time为键创建临时数组$result,用于存储每个time对应的最小amount元素
  2. 遍历原始数组,若当前time未在临时数组中,直接存入完整元素
  3. 若time已存在,比较当前元素与临时数组中对应元素的amount,保留更小的那个
  4. 最后用array_values()重置数组索引,得到符合预期的多维数组结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:59:57