iT邦幫忙

1

PHP 將值放入陣列後轉成json格式的問題

<?php
    $array = [];
    array_push($array,'1');
    print_r($array);
?>

print_r的結果為 Array ( [0] => 1 )

<?php
    $array = [];
    $array['a'] = '1';
    print_r($array);
?>

print_r的結果為 Array ( [a] => 1 )

但是再轉換成json格式時(json_encode($array))
用array_push的變成  ["1"]
用$array['a']的變成 {"a":"1"}

print_r的格式都是相同的,為何轉json會變成不同格式呢?

1
浩瀚星空
iT邦大師 1 級 ‧ 2019-11-08 13:05:58

array_push是取值而已,會勿略及key值名稱。所以才會只有["1"]值。

cheer0101 iT邦新手 5 級 ‧ 2019-11-08 13:13:11 檢舉

請問我想保留[]陣列型態,而不是用{},可以怎麼做呢?

其實我沒注意到你說的是array_push。最近忙著看新的東西。沒去注意到。
其他人有說明的很清楚了。我就簡單說點就好

我就簡單來說好了。你想要有key值存在的陣列值。
那就是給它有key值的陣列就好。
你給它沒key值的值。當然就會從0編碼了。
而數值索引在非指定的情況下。並不會特別將key值標示出來的。

0
阿展展展
iT邦研究生 2 級 ‧ 2019-11-08 13:13:43

array_push()
函數像低一個參數的組委添加一個或多個元素, return 新array 的長度
該函數等於多次調用 $array[] = $value。


你的問題不在於 JSON
而是

array_push 跟  $array['a'] = '1';   本質上就是不一樣的
看更多先前的回應...收起先前的回應...
cheer0101 iT邦新手 5 級 ‧ 2019-11-08 13:20:11 檢舉

我想用$array['a'] = '1' ,轉乘json時不要變成{},而是[],該怎麼做呢?謝謝

阿展展展 iT邦研究生 2 級 ‧ 2019-11-08 13:25:30 檢舉

不可能,json 就是一堆 [{},,{},{},{}...] 的東西才叫 json 你是看了什麼書阿/images/emoticon/emoticon19.gif

cheer0101 iT邦新手 5 級 ‧ 2019-11-08 13:30:11 檢舉

應該說 我有做一個json,原本是用array_push()加入資料,但是我想把array_push()改成$array['a'] = ''的方式,原本[]包覆的資料全部變成{}包覆,所以才上來問如何維持[]包覆
我希望陣列內的值前面可以加上索引值

小魚 iT邦大師 1 級 ‧ 2019-11-08 15:23:11 檢舉

[]是陣列.
{}是字典.
基本上應該是全球通用的了.
除非你要寫一個新的規則打敗Google, 微軟 + 蘋果.

淺水員 iT邦新手 2 級 ‧ 2019-11-08 16:53:18 檢舉

cheer0101

我希望陣列內的值前面可以加上索引值

請問[]要怎麼包?
例如 $array['abc'] = 'def'; ,你希望這個轉出來的結果長什麼樣子?

也許問題不在 [] 或 {} ,而是打算怎麼使用這些資料。因為照原本的方式,PHP 跟 javascript 在資料交換上完全是銜接的,並沒有甚麼問題。

fillano iT邦超人 1 級 ‧ 2019-11-11 09:15:36 檢舉

$array[]='';就會自動加上索引,樓主是正解阿,你怎麼不先試一下XD

1
小魚
iT邦大師 1 級 ‧ 2019-11-08 13:27:57

如果是從0開始的陣列,
轉成json會變成 [],
用其他語言讀可以用Array解析,

如果不是(即使是數字index),
轉成json會變成 {},
用其他語言讀要用Dictionary解析.

這個坑我踩過...

看更多先前的回應...收起先前的回應...
cheer0101 iT邦新手 5 級 ‧ 2019-11-08 13:34:23 檢舉

抱歉,可以請大大獎詳細一點嗎? 或有甚麼參考連結,謝謝

php的陣列有分二種,一種是純陣列,一種是hash table
前者在一般的語言仍然是array,後者稱之為:dictionary
也就是字典。
知道什麼是字典吧。就像漢英或英漢字典。
英文像是key,漢字是value(其實反過來也對)
這種就叫做「雜湊」

認真的說,在一般的語言下連dictionary雜湊都是沒有順序可言的。
但php是個怪胎。他讓array和dictionary變成了不分的狀態。
在php的語言你可以這樣玩,但是一但轉換成別的語言格式,這種玩法就會有很大的問題。

結論:是array,就不要給他key值,是dictionary,那就給吧。
如果要混亂搭用,有可能就是自討苦吃了。

小魚 iT邦大師 1 級 ‧ 2019-11-08 14:17:37 檢舉

這沒有連結,
只是我的經驗,
也很難解釋,
總之
[]是陣列(Array),
{}是字典(Dictionary),
如果你不知道Dictionary可能要查一查.
這是C#的Dictionary的一些用法介紹.
C# Dictionary的用法,以及查字典的用途
現在Dictionary已經算是基本的類別了吧.

小魚 iT邦大師 1 級 ‧ 2019-11-08 14:21:07 檢舉

Samと可樂快跑
說到這個,
我那時候找這個問題找了好幾個小時,
因為我的陣列是從1開始,
結果PHP自動幫我轉成Dictionary,
但是沒資料的時候我用的是[](Array),
然後接我資料的Python工程師就開始OOXX...

結果後來改成從0開始就解決了.
/images/emoticon/emoticon11.gif

小魚
弱型別語言就是這樣了。
如果不自己處理好,要交給直譯或編譯器去判斷,
就很有可能會出差錯。

自從接觸了不同的語言之後,有時我還真的覺得php該廢………
看似讓初學者容易入門,其後卻製造了很多的麻煩。

淺水員 iT邦新手 2 級 ‧ 2019-11-08 15:43:21 檢舉

json_encode 有第二個參數,用 JSON_FORCE_OBJECT 就會把它強制輸出成 {} 了

froce iT邦大師 4 級 ‧ 2019-11-08 15:53:22 檢舉

弱型別語言就是這樣了

js:我也該廢,但你能拿我怎樣?

小魚 iT邦大師 1 級 ‧ 2019-11-08 15:55:19 檢舉

淺水員
原來如此,
不過他要的好像是[]

cheer0101 iT邦新手 5 級 ‧ 2019-11-08 16:39:55 檢舉
[
{
		"state_code": "1",
		"nation_code": "tw",
		"state_name": "台灣",
		"tw_county": {
			"1": {
				"county_code": "1",
				"state_code": "1",
				"county_name": "台北市",
				"tw_city": {
					"1": {
						"city_code": "1",
						"county_code": "1",
						"city_name": "中正區",
						"zip_code": "100"
					},
					"2": {
						"city_code": "2",
						"county_code": "1",
						"city_name": "大同區",
						"zip_code": "103"
					}
              }
           }
        }  
 ]       

請問如果json 可以寫物件包物件嗎? 謝謝

小魚 iT邦大師 1 級 ‧ 2019-11-08 16:47:56 檢舉

物件包物件可以啊,
你可以先試試看,
有遇到問題再問.

cheer0101 iT邦新手 5 級 ‧ 2019-11-08 16:54:36 檢舉

小魚 因為剛接觸,不確定一般會不會這樣去寫,因為看到通常都是陣列包物件 謝謝

淺水員 iT邦新手 2 級 ‧ 2019-11-08 17:03:32 檢舉

這樣包也是可以的

[
    {
        "state_code": "1",
        "nation_code": "tw",
        "state_name": "台灣",
        "tw_county": [
            {
                "county_code": "1",
                "state_code": "1",
                "county_name": "台北市",
                "tw_city": [
                    {
                        "city_code": "1",
                        "county_code": "1",
                        "city_name": "中正區",
                        "zip_code": "100"
                    },{
                        "city_code": "2",
                        "county_code": "1",
                        "city_name": "大同區",
                        "zip_code": "103"
                    }
                ]
            }
        ]
    }	
]

{ } <== 這是因為引用了js的概念,可實際上json是不包含方法存在的。
單純的把這個看成dictionary會比較妥當。
(如果json包入method我會覺得是很危險的一件事,因為這變成可能從js去注入不該被執行的東西。)

1
ccutmis
iT邦高手 9 級 ‧ 2019-11-08 13:36:52

how to use array_push for json_encode
https://stackoverflow.com/questions/22421132/how-to-use-array-push-for-json-encode

Demo:

<?php
    $array = [];
    array_push($array,array('name' => 'aloha','hp' => 999,'mp' => 999));
    array_push($array,array('name' => 'Bob','hp' => 9999,'mp' => 1));
    print_r($array);
    echo '<br/>';
    print_r(json_encode($array));
?>

Result:

Array ( [0] => Array ( [name] => aloha [hp] => 999 [mp] => 999 ) [1] => Array ( [name] => Bob [hp] => 9999 [mp] => 1 ) )
[{"name":"aloha","hp":999,"mp":999},{"name":"Bob","hp":9999,"mp":1}]

我要發表回答

立即登入回答