2010-08-09 72 views
1

我有這樣的$海峽值:PHP類JSON字符串分割

[{\"firstname\":\"guest1\",\"lastname\":\"one\",\"age\":\"22\",\"gender\":\"Male\"},{\"firstname\":\"guest2\",\"lastname\":\"two\",\"age\":\"22\",\"gender\":\"Female\"}] 

我想將它分爲以下:

firstname:guest1,lastname:one,age:22 
firstname:guest2,lastname:two,age:22 

我試過explode (",",$str),但它全部採用爆炸,作爲分隔符,我沒有得到我想要的東西

任何人都可以幫助我?

回答

0

如果你分裂,的那麼你會得到圍繞它的所有其他廢話。你將不得不剝去它。

看起來很像JSON數據給我,這個字符串來自哪裏?

+0

它來自一個通常的形式張貼在網站上... – redcoder 2010-08-09 14:10:58

+0

數據類型爲字符串時,我用var_dump – redcoder 2010-08-09 14:11:25

+0

JSON數據是一個字符串。請參閱http://json.org/ – 2010-08-09 17:53:15

5

正如Josh K指出的那樣,它看起來像JSON字符串一樣可疑。也許你應該做一個json_decode()就可以得到你正在尋找的實際數據,所有數據都很好地組織成一個對象數組。

編輯:看來你的字符串本身雙引號括起來",所以你必須要修剪掉那些你就可以把它作爲解碼有效的JSON之前:

$str_json = trim($str, '"'); 
$guests = json_decode($str_json); 
var_dump($guests); 

我獲得與此var_dump()輸出,所以在這裏是絕對有效的JSON:

array(2) { 
    [0]=> 
    object(stdClass)#1 (4) { 
    ["firstname"]=> 
    string(6) "guest1" 
    ["lastname"]=> 
    string(3) "one" 
    ["age"]=> 
    string(2) "22" 
    ["gender"]=> 
    string(4) "Male" 
    } 
    [1]=> 
    object(stdClass)#2 (4) { 
    ["firstname"]=> 
    string(6) "guest2" 
    ["lastname"]=> 
    string(3) "two" 
    ["age"]=> 
    string(2) "22" 
    ["gender"]=> 
    string(6) "Female" 
    } 
} 

JSON (JavaScript Object Notation)CSV (comma-separated values)。他們是兩種截然不同的數據格式,所以你不能像其他人那樣解析它們。

爲了讓您的兩個字符串,使用循環獲取每個對象的鍵和值,然後使用這些值建立字符串:

foreach ($guests as $guest) { 
    $s = array(); 

    foreach ($guest as $k => $v) { 
     if ($k == 'gender') break; 
     $s[] = "$k:$v"; 
    } 

    echo implode(',', $s) . "\n"; 
} 

輸出:

firstname:guest1,lastname:one,age:22 
firstname:guest2,lastname:two,age:22 

(假設你確實想排除任何原因的性別;如果沒有,刪除if ($k == 'gender') break;行。)

+0

我得到一個NULL值..使用 $ guests = json_decode(stripslashes($ str)); var_dump($ guests); – redcoder 2010-08-09 14:18:23

+0

@redcoder:奇怪。我從你的問題中複製了字符串,並可以正確解析它;你可以'var_dump($ str);'所以我可以看到實際的'$ str'是什麼? – BoltClock 2010-08-09 14:23:39

+0

不需要'stripslashes'。請參閱:http://pastebin.com/tGpQewqi – 2010-08-09 14:31:12

0

如果這是有效的json,只需運行它json_decode()獲得原生PHP數組...

注意,你可能需要通過stripslashes()先來運行它,因爲它似乎你可能有magic_quotes_gpc集...您可以通過有條件地使用功能get_magic_quotes_gpc檢查調用它:

if (get_magic_quotes_gpc()) { 
    $_POST['foo'] = stripslashes($_POST['foo']); 
} 
$array = json_decode($_POST['foo']); 
+0

我懷疑它是JSON,因爲當我使用var時,原始數據類型是字符串_dump ... – redcoder 2010-08-09 14:29:33

+0

JSON是一種編碼。它將信息編碼成一個字符串。因此,原始數據類型應該是字符串,如果它是JSON ... – ircmaxell 2010-08-09 14:37:22

+0

@redcoder:JSON本身不是對象數據類型。這是一個格式化的字符串,以便在程序處理它時獲得一個對象。 – BoltClock 2010-08-09 14:43:49

0

您需要使用preg_replace函數。

$ptn = "/,\\"gender\\":\\"\w+\\"\}\]?|\\"|\[?\{/"; 
    $str = "[{\"firstname\":\"guest1\",\"lastname\":\"one\",\"age\":\"22\",\"gender\":\"Male\"},{\"firstname\":\"guest2\",\"lastname\":\"two\",\"age\":\"22\",\"gender\":\"Female\"}]"; 
    $rpltxt = ""; 
    echo preg_replace($ptn, $rpltxt, $str); 

您可以通過php regular expression tester來測試結果。

或使用preg_match_all

$ptn = "/(firstname)\\":\\"(\w+)\\",\\"(lastname)\\":\\"(\w+)\\",\\"(age)\\":\\"(\d+)/"; 
$str = "[{\"firstname\":\"guest1\",\"lastname\":\"one\",\"age\":\"22\",\"gender\":\"Male\"},{\"firstname\":\"guest2\",\"lastname\":\"two\",\"age\":\"22\",\"gender\":\"Female\"}]"; 
preg_match_all($ptn, $str, $matches); 
print_r($matches); 
0

我還沒有得到一個機會來檢索JSON: 我的var_dump修剪值:

$str_json = trim($userdetails->other_guests, '"'); 
$guests = json_decode($str_json); 
var_dump($str_json,$guests); 

WHERE $userdetails->other_guests$str值我曾經...

我得到以下outp UT:

string(169) "[{\"firstname\":\"guest1\",\"lastname\":\"one\",\"age\":\"22\",\"gender\":\"Male\"},{\"firstname\":\"guest2\",\"lastname\":\"two\",\"age\":\"23\",\"gender\":\"Female\"}]" 
NULL 

這意味着解碼JSON是NULL ...奇怪

+0

哦..實際上我必須decode_jason兩次才能得到對象 – redcoder 2010-08-11 08:18:21