2016-11-02 4 views
0

Ich versuche, einen benutzerdefinierten Controller für das WordPress-JSON-API-Plugin zu erstellen und bis jetzt funktioniert alles außer die JSON-Daten, die ich habe, ist nicht im richtigen Format.Wie formatiere ich die JSON-Ausgabe auf das gewünschte Format

Dies ist meine aktuelle JSON Ausgabe:

{ 
    "status": "ok", 
    "all_tags": { 
    "tag-1": { 
     "term_name": "Tag 1", 
     "category_details": { 
     "0": { 
      "category_ID": 8, 
      "category_name": "category 1", 
      "category_count": 2 
     }, 
     "2": { 
      "category_ID": 13, 
      "category_name": "category 2", 
      "category_count": 1 
     } 
     } 
    }, 
    "tag-2": { 
     "term_name": "Tag 2", 
     "category_details": [ 
     { 
      "category_ID": 8, 
      "category_name": "category 1", 
      "category_count": 2 
     } 
     ] 
    } 
    } 
} 

Um jedoch die Daten zu analysieren ich muss die JSON-Daten in einem bestimmten Format haben. Das richtige Format sollte wie folgt sein:

{ 
    "status": "ok", 
    "all_tags": [ 
    { 
     "id": 1, 
     "term_name": "Tag 1", 
     "category_details": [ 
     { 
      "id": 2, 
      "category_ID": 8, 
      "category_name": "category 1", 
      "category_count": 2 
     }, 
     { 
      "id": 3, 
      "category_ID": 13, 
      "category_name": "category 2", 
      "category_count": 1 
     } 
     ] 
    }, 
    { 
     "id": 2, 
     "term_name": "Tag 2", 
     "category_details": [ 
     { 
      "id": 2, 
      "category_ID": 8, 
      "category_name": "category 1", 
      "category_count": 2 
     } 
     ] 
    } 
    ] 
} 

Dies ist, wie ich das Array für die json erschaffe:

<?php 
... 
$cats_all  = array(); // the array 
if (!isset($cats_all[$custom_term->slug])) { 

    // create the array 

    $cats_all[$custom_term->slug] = array(
     'term_name' => $custom_term->name, 
     'category_details' => array(
      array(
       'category_ID' => $categories[0]->term_id, 
       'category_name' => $categories[0]->name, 
       'category_count' => $mycats[0]->category_count 
      ) 
     ) 
    ); 
} else { 
    $cats_all[$custom_term->slug]['category_details'][] = array(
     'category_ID' => $categories[0]->term_id, 
     'category_name' => $categories[0]->name, 
     'category_count' => $mycats[0]->category_count 
    ); 
} 
... 
// remove duplicates 
$input = $this->super_unique($cats_all); 
// return the array for json output by the plugin 
return array(
    'all_tags' => $input, 
); 

Jede Hilfe wird sehr geschätzt. Auch der gesamte Controller kann viewed here sein.

+0

Wie bestimmen Sie 'count' und' id' Werte? Sie scheinen nichts in Ihrer aktuellen JSON-Ausgabe zu entsprechen. Es scheint auch seltsam, es sollte doppelte ID-Werte geben ... – trincot

+0

@trincot Ich habe nur eine der Standard-Controller-Ausgabe des Plugins verwendet, um zu zeigen, wie die Struktur sein sollte und vergaß, sie zu entfernen. –

+0

OK, Sie haben 'count' entfernt, was ist mit den' id' Werten? Werden sie benötigt? – trincot

Antwort

1

Es gibt zwei Dinge, die Sie weitere Informationen benötigen erreichen müssen: nicht

  1. Der all_tags Wert muss eine sequenzielle Array, ein assoziatives ein . Dies kann man erreichen, indem die array_values in der letzten Erklärung unter:

    return array(
        'all_tags' => array_values($input) 
    ); 
    
  2. Die category_details Werte müssen sequenzielle Arrays sein, nicht assoziativ diejenigen. Dieser ist schwieriger, als Sie tatsächlich als sequenzielle Arrays erstellen, aber die Funktion super_unique wird manchmal sie in assoziative Arrays, wenn es mindestens ein Duplikat entfernt.Ich schlage vor, dieses Update auf die Funktion super_unique durch zwei Aussagen hinzufügen, um dieses:

    $result = array_map('unserialize', array_unique(array_map('serialize', $array))); 
    

    Um dies zu erhalten:

    $is_seq = end(array_keys($array)) == count($array)-1; 
    $result = array_map('unserialize', array_unique(array_map('serialize', $array))); 
    if ($is_seq) $result = array_values($result); 
    

    Wenn Sie einen Fehler auf end bekommen, dann können Sie dies für diese Verwendung stattdessen Linie:

    end($array); $is_seq = key($array) == count($array)-1; 
    

    Die $is_seq Variable überprüft, dass $array sequentiell ist, und wenn ja, ruft array_values nach dem Entfernen der Duplikate, die immer ein sequenzielles Array zurückgibt.

+1

Gern geschehen. Ich habe eine Alternative für die Anweisung mit 'end' hinzugefügt, die einen Fehler auslösen könnte. ;-) – trincot

0

Ich denke, dass das Problem hier ist diese:

 "0": { 
      "category_ID": 8, 
      "category_name": "category 1", 
      "category_count": 2 
     }, 
     "2": { 
      "category_ID": 13, 
      "category_name": "category 2", 
      "category_count": 1 
     } 

, wenn Sie ein Array wollen ein json codiert Array sein, Indizes numerisch sein muss und Korrelate (0,1,2,3 ...)

Wahrscheinlich, nachdem Sie $ this-> super_unique ($ cats_all) oder innerhalb dieser Funktion verwendet haben, sollten Sie array_values ​​für jedes Array aufrufen, das neu indiziert wurde; Es setzt die Werte des Arrays auf 0, 1, ... usw. zurück ... und wenn es kodiert ist, wird es ein Array anstelle eines Objekts sein.

Im Allgemeinen ist es eine gute Methode, $ array = array_values ​​($ array) zu verwenden, nachdem array_filter (...) verwendet wurde, um das Array korrekt neu zu indizieren. An anderen Stellen können Indizes wie 0,2,7 erhalten werden. . etc ...

Lassen Sie mich wissen, wenn Sie

Verwandte Themen