首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Php的数组数据智能合并

基于Php的数组数据智能合并
EN

Stack Overflow用户
提问于 2014-05-07 22:46:49
回答 2查看 122关注 0票数 0

基本上,我得到了一个具有这种结构的数组:

阵列:

代码语言:javascript
复制
0 => {
    time: "090019"
    val: "2.444"
    qta: "292"
    dir: "up"
    param: "S"
}

1=>  {
    time: "090019"
    val: "2.442"
    qta: "938"
    dir: "dwn"
    param: "N"
}

2 =>  {
    time: "090019"
    val: "2.442"
    qta: "220"
    dir: "up"
    param: "N"
}

3 =>  {
    time: "100043"
    val: "2.44"
    qta: "220"
    dir: "dwn"
    param: "N"
}

。。就这样等等

代码语言:javascript
复制
n =>  {
    time: "103051"
    val: "2.444"
    qta: "330"
    dir: "dwn"
    param: "N"
}

和我的目标是获得一个具有相同结构的数组,其中数据将以精确的方式合并。

如果两个ore更多的数组值具有相同的时间(时间)和值(val),则它们将被添加:如果它们具有相同的方向(dir),则减去它们(在这种情况下,结果方向将是较高值的(dir) )。param (param)是无关的。

我对Php非常陌生,当我必须解决这样的问题时,我从来不知道如何处理。

希望足够清楚,任何建议都将不胜感激。

编辑:

生成的数组如下所示:

代码语言:javascript
复制
0 => {
    time: "090019"
    val: "2.444"
    qta: "292"
    dir: "up"
    param: "S"
}

1 =>  {
    time: "090019"
    val: "2.442"
    qta: "718"
    dir: "dwn"
    param: "N"
}

2 =>  {
    time: "100043"
    val: "2.44"
    qta: "220"
    dir: "dwn"
    param: "N"
}


..

n =>  {
    time: "103051"
    val: "2.444"
    qta: "330"
    dir: "dwn"
    param: "N"
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-08 03:09:22

这是一个很有趣的问题,所以这里有一些可能对你有用的东西,开箱即用:)

首先,定义您的项目:

代码语言:javascript
复制
$items = array(

    array(
        "time" => "090019",
        "val" => "2.444",
        "qta" => "292",
        "dir" => "up",
        "param" => "S",
    ),

    array(
        "time" => "090019",
        "val" => "2.442",
        "qta" => "938",
        "dir" => "dwn",
        "param" => "N",
    ),

    array(
        "time" => "090019",
        "val" => "2.442",
        "qta" => "220",
        "dir" => "up",
        "param" => "N",
    ),

    array(
        "time" => "100043",
        "val" => "2.44",
        "qta" => "220",
        "dir" => "dwn",
        "param" => "N",
    ),

);

接下来,迭代一次items数组,根据同一时间和val将项分组:

代码语言:javascript
复制
$grouped_items = array();

foreach($items as $item) {
    $key = "{$item['time']}-{$item['val']}";

    if( empty($grouped_items[$key]) ) $group_items[$key] = array();

    $grouped_items[$key][] = $item;
}

此时,您有一个包含键的数组,该数组的键等于time-val。其中每一个都是一个子数组,包含与该项匹配的所有项的列表-val(因此,您将相同的时间/val项分组在一起)。最后,您可以创建合并列表:

代码语言:javascript
复制
$final_items = array();

foreach($grouped_items as $item_list) {
    $final_items[] = mergeItems($item_list);
}

// merge a list of items with the same time and val
function mergeItems($items) {
    $merged_item = array(
        "time" => $items[0]['time'],
        "val" => $items[0]['val'],
        "qta" => 0,
        "dir" => null,
        "param" => $items[0]['param'],
    );

    // add or subtract qta values
    foreach($items as $item) {
        if( $item['dir'] == "up" ) {
            $merged_item["qta"] += (int) $item["qta"];
        }
        else {
            $merged_item["qta"] -= (int) $item["qta"];
        }
    }

    // set the final qta and dir value
    if( $merged_item["qta"] < 0 ) {
        $merged_item["qta"] *= -1;
        $merged_item["dir"] = "down";
    }
    else {
        $merged_item["dir"] = "up";
    }

    return $merged_item;
}

现在,$final_items有了合并列表。

如果将所有这些粘贴到一个PHP脚本中,它将运行并给出所需的输出。如果它没有完全按照您的实际数据来处理,那么您就忘了在问题中提到一些内容,可能可以使用这个示例来创建一些有用的东西:)

票数 0
EN

Stack Overflow用户

发布于 2014-05-07 22:53:06

这是一个通用的答案,您可以使用新的qta来做您想做的事情:

代码语言:javascript
复制
$items = array([put your data here]);

for($i=0; $i < count($items); $i++) {
    for($j=0; $j < count($items); $j++) {
        // don't compare and item to itself
        if($i == $j) continue;

        // if their times and values are equal
        if( $items[$i]["time"] == $items[$j]["time"] && $items[$i]["val"] == $items[$j]["val"]) {
            // dirs are the same
            if( $items[$i]["dir"] == $items[$j]["dir"] ) {
                $newqta = $items[$i]["qta"] + $items[$j]["qta"];
                $newdir = $items[$i]["dir"];
            }
            // dirs are different
            else {
                $newqta = $items[$i]["qta"] - $items[$j]["qta"];

                if( $items[$i]["qta"] > $items[$j]["qta"] ) {
                    $newdir = $items[$i]["dir"];
                }
                else {
                    $newdir = $items[$j]["dir"];
                }
            }

            // do something with $newqta and $newdir
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23529787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档