2017-08-01 1 views
0

j'ai données comme suit:Retirez exemple de crochets, se trouve deux instances successives

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

Maintenant, je veux supprimer l'instance de crochets à savoir [ et ] s'il y a deux instances successives comme ceci [ [ ou ] ]. Maintenant, si vous voyez les données ci-dessus, vous verrez qu'il y a des instances de [ et ] qui sont répétées deux fois successivement. Donc, je veux supprimer une instance de chacun.

Maintenant, je peux vérifier les deux instances successivement répétées de chacun et de supprimer un, comme celui-ci

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

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

Maintenant, le code ci-dessus est pour [. Donc, pour supprimer l'instance successivement répétée de ], je vais devoir répéter le même code à nouveau.

Je veux savoir, existe-t-il un meilleur moyen d'atteindre le même résultat ou non. En attendant, je peux y arriver, mais que se passe-t-il si, à l'avenir, je devrais faire la même chose pour n'importe quel autre personnage? Veuillez me guider ici.

+1

Comme il semble être un JSON, il n'y a aucun moyen d'imbriquer des accolades, car il représente un objet et nécessite une clé de type string. – ZdaR

+0

Oui, vous avez raison, je vais refactoriser ma question. –

+0

Pourquoi écrivez-vous json comme ça? –

Répondre

4

Vous traitez une chaîne JSON. Il est contre-indiqué d'essayer des manipulations de cordes (avec regex ou autre) car il y a des pièges très possibles avec un "sur-appariement". Bien que je ne comprenne pas complètement la variabilité de votre structure de données, je peux fournir des conseils temporaires en convertissant votre chaîne JSON en tableau et en modifiant les données en toute sécurité avec une fonction de tableau.

Considérez ceci:

code: (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; 

Sortie:

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

Pour cette question, si vous savez où le double nested- Les index sont, alors vous pouvez y accéder sans boucler (ou modifier par référence) comme ceci:

$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

Que diriez-vous:

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

ouais, ça marche, mais que se passe-t-il si les espaces entre les deux instances de parenthèses manquent? Alors votre code ne fonctionnera pas. Et si, à l'avenir, je devrais faire la même chose pour n'importe quel autre personnage? –