2014-05-07 36 views
0

智能合併基本上我得到了與這種結構的陣列:陣列數據用PHP

陣列:

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" 
} 

我的目標是獲得一個結構相同的數組,其中數據將以精確的方式合併。

如果兩個或多個數組的值具有相同的時間(時間)和值(VAL)它們將被:如果他們不加入,如果他們有相同的方向(DIR),並減去(在這種情況下結果的方向將是較高值的(dir))。參數(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" 
} 
+0

你能舉出一個例子嗎?在你的初始數組中,然後你想要結果看起來像什麼? – Cully

+0

如果您有三個或四個相同的項目,該怎麼辦?你想如何合併它們? – Cully

+0

如果你有四個項目有相同的時間和val,你說你想讓他們「如果他們有相同的方向(迪爾),並添加,如果他們不」,但你怎麼確定「同一方向」,當你有四個方向值?你的意思是所有的「up」dirs都添加到「down」嗎?那從哪個中減去哪個?你的意思是一個積極的,一個積極的消極的,你把它們加在一起? – Cully

回答

0

這是一種有趣的問題,所以這裏有些東西可能適用於你,開箱即用:)

首先,定義您的項目:

$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", 
    ), 

); 

接下來,通過項目陣列重複一次,項目組一起基於相同的時間和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; 
} 

在這一點上,你有鑰匙的數組等於時間val。其中每一個都是一個包含與該item-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腳本中,它將運行併爲您提供所需的輸出。如果它不完全符合你想要的真實數據,那麼你忘了在你的問題中提到一些東西,可以使用這個例子來創建一些可以工作的東西:)

+0

首先感謝您爲此奉獻的時間。現在,我的目的是學習如何處理這種情況。你能解釋第一個foreach循環是如何工作的嗎?我不清楚.. – Plastic

+0

@Plastic你想知道你的列表中哪些項目匹配,以便你可以合併它們。第一個foreach根據匹配時間和vals循環遍歷項目並將它們分組在一起。它將匹配項放在一起,形成一些「子陣列」。 – Cully

+0

這是創建小「子陣列」的命令? $ key =「{$ item ['time']} - {$ item ['val']}」; $ group_items [$ key] = array(); $ grouped_items [$ key] [] = $ item; 第一行是什麼意思? – Plastic

0

這是一個通用的答案,你可以做你想做的新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 
     } 
    } 
} 
+0

感謝您的快速答案。如果兩個或更多項目將被添加/減去,那麼結果項目的'dir'參數的值是多少? – Plastic

+0

你是什麼意思加/減?你想添加什麼?或者你的意思是包含/不包含在最終的數據陣列中? – Cully

+0

讓我們假設項目2和3是: 1 => {time:「090019」val:「2.44」qta:「938」dir:「dwn」param:「N」} 2 => {time:「090019 「val:」2.44「qta:」220「dir:」up「param:」N「} thet qta將會是938-220 = 718的結果,但是數組中的新項目會有dir ='up'或「曙光」?我希望那將是'曙光'因爲938是更大.. – Plastic