2017-08-01 70 views
0

我有如下方式的數據:和刪除方括號的情況下,如果發現兩個連續的實例

{"id": "sugarcrm", "text": "sugarcrm", "children": [ [ { "id": "accounts", "text": "accounts", "children": [ { "id": "id", "text": "id" }, { "id": "name", "text": "name" } ] } ] ] } 

現在,我想刪除括號的實例即[]如果有兩個連續的情況下像這樣[ [] ]

現在,如果您看到上述數據,您會看到存在[]的實例,它們會連續重複兩次。所以我想刪除每個的一個實例。現在

,我可以檢查每個的兩次相繼重複實例和移除一個,這樣

$text = '{"id": "sugarcrm", "text": "sugarcrm", "children": [ [ { "id": "accounts", "text": "accounts", "children": [ { "id": "id", "text": "id" }, { "id": "name", "text": "name" } ] } ] ] }'; 

echo preg_replace('/\[ \[+/', '[', $text); 

現在,上面的代碼是用於[。因此,要刪除]的連續重複實例,我必須再次重複相同的代碼。

我想知道,有沒有更好的方法來實現相同的結果。同時,我可以解決這個問題,但如果將來我還要爲其他角色做同樣的事情呢?請在這裏指導我。

+1

因爲它看起來像一個JSON,沒有辦法嵌套大括號,因爲它代表一個對象,並且需要一個字符串類型的鍵。 – ZdaR

+0

是的,你說得對,我會重構我的問題。 –

+0

你爲什麼這樣搗亂json? –

回答

4

你正在處理一個JSON字符串。這是禁忌嘗試字符串操作(與正則表達式或其他),因爲有非常可能的「過度匹配」的陷阱。

儘管我不完全理解數據結構的可變性,但我可以通過將json字符串轉換爲數組,然後使用數組函數安全地修改數據來提供臨時指導。

考慮一下:

代碼:(Demo

$json='{"id": "sugarcrm", "text": "sugarcrm", "children": [ [ { "id": "accounts", "text": "accounts", "children": [ { "id": "id", "text": "id" }, { "id": "name", "text": "name" } ] } ] ] }'; 
$array=json_decode($json,true); // convert to array 
foreach($array as &$a){ // $a is modifiable by reference 
    if(is_array($a) && isset($a[0]) && isset($a[0][0])){ // check if array and if two consecutive/nested indexed subarrays 
     $a=array_column($a,0); // effectively shift deeper subarray up one level 
    } 
} 
$json=json_encode($array); 
echo $json; 

輸出:

{"id":"sugarcrm","text":"sugarcrm","children":[{"id":"accounts","text":"accounts","children":[{"id":"id","text":"id"},{"id":"name","text":"name"}]}]} 

對於這個問題,如果你知道其中雙nested-索引是,那麼你可以訪問他們沒有循環(或修改參考)像這樣:

$json='{"id": "sugarcrm", "text": "sugarcrm", "children": [ [ { "id": "accounts", "text": "accounts", "children": [ { "id": "id", "text": "id" }, { "id": "name", "text": "name" } ] } ] ] }'; 
$array=json_decode($json,true); 
$array['children']=array_column($array['children'],0); // modify 2 known, nested, indexed subarrays 
$json=json_encode($array); 
echo $json; 
-1

如何:

echo str_replace(array('[ [', '] ]'), array('[', ']'), $text); 
+0

是的,它正在工作,但如果兩個括號的實例之間的空白不見了,該怎麼辦?那麼你的代碼將無法工作。如果將來我還要爲其他角色做同樣的事情呢? –

相關問題