iT邦幫忙

0

json string 怎麼合併和加總?

好奇幾個問題:
https://imgur.com/IbDlzIW (資料多筆,其中的兩筆)
這種格式,如果想要把它⋯⋯

  1. 合併成一個 json ?
    {"charm":1,"hp":1}, {"charm":2,"hp":1}
    to
    {"charm":3,"hp":2}
  2. key 會不固定,但有機會重複,能怎麼自動 sum?
    每次可能都不同
    {"charm":1,"hp":2}
    {"charm":3,"ccc": 2, "hp":1}
    {"aaa":3,"bbb":2, hp":2}

能怎麼做?感謝各路好手

正常這種東西我會覺得後端要做掉啦..........前端就是把他變物件,重新計算
1
froce
iT邦大師 1 級 ‧ 2019-11-25 10:20:34
最佳解答

1.前端運算的話,你有map、reduce可以用。
2.存到資料庫的話,除非你用nosql,要不然通常會轉成正規的資料庫欄位處理。
直接存json string通常是沒辦法的辦法。

然後我同意星空大...

1
浩瀚星空
iT邦超人 1 級 ‧ 2019-11-25 10:13:14

這算是我最後一次幫你了。
你最好仔細看明白聽明白。

一般會存成json格式的,大多就是會有不確定數量或key名稱的東西。
也就是不穩定的參數值才會存成json處理。
自然,存成json如果需要對其值做一些操作控制的情況下。就得要做額外的處理。

所以,這樣的寫法。並沒有好與不好。有無問題等等。
這些全取決在工程師的能力及規劃上。

別人寫的,可能有其用意。如果你推測不出來用意。一般就是兩種情況。
原工程師寫的不好
或是你看不懂意義。

你覺得你會當哪一種呢?

第一次看到沒有幫助旁邊會有數字
原來有這個功能 /images/emoticon/emoticon19.gif

其實沒差。這功能很早就有了。

1
舜~
iT邦高手 1 級 ‧ 2019-11-25 10:27:20

這是資料庫某格欄位的資料內容??
哪個資料庫(mysql? mssql? )?什麼版本?

mysql 5.7以上的話,參考這篇的 "查询 JSON" 小節

mssql的話,參考這篇

剩下的您自行下sql

ps.版本不支援?? 那嘗試用regex或把資料抓出來另外處理在塞回去吧~~

看更多先前的回應...收起先前的回應...
松松 iT邦研究生 2 級 ‧ 2019-11-25 10:28:18 檢舉

mysql 8.0.18

松松 iT邦研究生 2 級 ‧ 2019-11-25 10:31:10 檢舉

也就是說其實 json string 也是一個好用的作法

舜~ iT邦高手 1 級 ‧ 2019-11-25 10:34:04 檢舉

不過效能會差很多,然後不小心來個錯字就找不到內容了~~

松松 iT邦研究生 2 級 ‧ 2019-11-25 10:34:50 檢舉

了解.. @@

4
海綿寶寶
iT邦大神 1 級 ‧ 2019-11-25 10:28:33
<?php
  $strIN = '[{"charm":1,"hp":1}, {"charm":2,"hp":1}]';
  $arrIN = json_decode($strIN, true);
  
  $charm = 0;
  $hp = 0;
  foreach ($arrIN as $key => $value) {
    $charm = $charm +  $value["charm"];
    $hp = $hp +  $value["hp"];
  }
  
  $arrOUT = array(
      "charm" => $charm,
      "hp" => $hp
      );
  $strOUT = json_encode($arrOUT);
  echo $strOUT;
?>

選我正解

看更多先前的回應...收起先前的回應...
松松 iT邦研究生 2 級 ‧ 2019-11-25 10:29:34 檢舉

等於是把 json string 當真正的 json 先 json_decode 變 array

松松 iT邦研究生 2 級 ‧ 2019-11-25 10:32:00 檢舉

我輸出來的 json 是

"score": [
            "{\"charm\":1,\"hp\":1}",
            "{\"charm\":2,\"hp\":1}"
        ]

海綿,這樣真的會讓他學不會啦。
不過說真的,答案已經出來了。還搞不定。
這......好吧。現在覺得海綿你的做法很對了。

rewrite iT邦新手 4 級 ‧ 2019-11-25 10:45:29 檢舉

/images/emoticon/emoticon06.gif

froce iT邦大師 1 級 ‧ 2019-11-25 11:07:19 檢舉

海綿寶寶把答案給他了,我才寫的...

function sumForArray($v1,$v2)
{
	return array(
		 "charm" => $v1["charm"] + $v2["charm"],
		 "hp" => $v1["hp"] + $v2["hp"],
		);
}

$strIN = '[{"charm":1,"hp":1}, {"charm":2,"hp":1}]';
$arrIN = json_decode($strIN, true);
print_r(array_reduce($arrIN,"sumForArray"));

https://ideone.com/QwdNuf#stdin
sumForArray可以改寫成萬用的,只要設定array抓不到key時的預設值就行了。
這還是我第一個PHP程式...(茶

松松 iT邦研究生 2 級 ‧ 2019-11-25 11:18:00 檢舉

少問了一個
因為 {"charm":1,"hp":1} 也會有其他 key 就像 {"charm":1, "ccc": 2,"hp":1} 而且 key 會重複
這是有怎樣函數可以解決呢

{"charm":2, "ccc": 2,"hp":1}

你這樣子下次沒人敢直接給你答案了。
這就是我說的,你不會不懂人家用json資料的用意。
如果真的有運算需要,就是額外處理。

而且說真的,你用 froce 給你的萬用寫法。去改寫一下也行啊。
為何一直要等人家寫出來給你。
麻煩你自已寫個程式碼處理出來吧。就算是錯誤的也沒關係。

松松 iT邦研究生 2 級 ‧ 2019-11-25 11:37:50 檢舉

to froce
好像懂 sumForArray 的用意,我試試

froce iT邦大師 1 級 ‧ 2019-11-25 11:59:34 檢舉
from functools import reduce

d1 = {
	'charm': 1,
	'ccc': 2,
	'hp': 3
}

d2 = {
	'charm': 2,
	'hp': 4
}

arr = [d1, d2]

def sumDict(v1, v2):
	allKeys = set(list(v1.keys()) + list(v2.keys()))   #取所有key的聯集
	result = dict()
	for k in allKeys:                                  #對所有key做累加
		result[k] = v1.get(k, 0) + v2.get(k, 0)        #用dict.get()給預設值
		
	return result
	
print(reduce(sumDict, arr))

https://ideone.com/cYzKSH
懶得跟PHP折騰,用python寫,自己去照著實現。

松松 iT邦研究生 2 級 ‧ 2019-11-25 12:25:05 檢舉

to froce
好的,感謝

我要發表回答

立即登入回答