基本上,我得到了一个具有这种结构的数组:
阵列:
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"
}。。就这样等等
n => {
time: "103051"
val: "2.444"
qta: "330"
dir: "dwn"
param: "N"
}和我的目标是获得一个具有相同结构的数组,其中数据将以精确的方式合并。
如果两个ore更多的数组值具有相同的时间(时间)和值(val),则它们将被添加:如果它们具有相同的方向(dir),则减去它们(在这种情况下,结果方向将是较高值的(dir) )。param (param)是无关的。
我对Php非常陌生,当我必须解决这样的问题时,我从来不知道如何处理。
希望足够清楚,任何建议都将不胜感激。
编辑:
生成的数组如下所示:
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"
}发布于 2014-05-08 03:09:22
这是一个很有趣的问题,所以这里有一些可能对你有用的东西,开箱即用:)
首先,定义您的项目:
$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将项分组:
$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项分组在一起)。最后,您可以创建合并列表:
$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脚本中,它将运行并给出所需的输出。如果它没有完全按照您的实际数据来处理,那么您就忘了在问题中提到一些内容,可能可以使用这个示例来创建一些有用的东西:)
发布于 2014-05-07 22:53:06
这是一个通用的答案,您可以使用新的qta来做您想做的事情:
$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
}
}
}https://stackoverflow.com/questions/23529787
复制相似问题