2017-09-12 2 views
0

Ich habe diese JSON hierOptimieren Suche in JSON mit Streichern aufsteigend

An der Wurzel gibt es einen Befehl (Eigenschaft) als wp die 39 Unterbefehle (Untereigenschaften) als cache hat, cap, checksum ... etc, wo jeder seine eigenen Unterbefehle hat und dies geht bis zu 4 Ebenen

Der bessere Teil ist, dass alle Unterbefehle in aufsteigender Reihenfolge angeordnet sind, dh; Zeichenketten sind in aufsteigender Reihenfolge angeordnet.

Ich möchte durchlaufen und suchen, ob ein Befehl wie oder wp term delete in der JSON-Struktur existiert. Ich möchte nicht mit einer for Schleife wegen der großen Zeitkomplexität iterieren. Es ist schon zu lange her, dass ich mein Engineering abgeschlossen habe und wenn mein Gedächtnis korrekt funktioniert, würde eine Baumstruktur die Suchzeit stark improvisieren.

Kann jemand mich auf die richtige Richtung auf dem Erreichen dieser? Ich benutze PHP als meine Sprache.

+0

'commands' und' Unter commands'? Meinst du "Eigenschaften" und "verschachtelte Eigenschaften"? – Script47

+0

ja, korrigieren @ Script47 –

+1

Bevor Sie einen Baum verwenden, sollten Sie es bauen. –

Antwort

0

hier eine binäre Suchlösung, müssen Sie Ihre json in eine Datei setzen ...
HINWEIS: weil wp nicht in einer subcommands Array ist, können Sie nicht danach suchen

<?php 
function binarySearch(&$myArray, $search, $start, $end) 
{ 
    $middle = ($start + $end) >> 1; // divide by 2 
    if ($middle >= $start) { 
     if ($search > $myArray[$middle]['name']) { // $search must be in top half of array 
      $result = binarySearch($myArray, $search, $middle + 1, $end); 
     } elseif ($search < $myArray[$middle]['name']) { // $search must be in bottom half of array 
      $result = binarySearch($myArray, $search, $start, $middle - 1); 
     } else { // $search is here 
      $result = $middle; 
     } 
    } else { 
     $result = false; // $search not found 
    } 
    return $result; 
} 

function findCommand($arrFound, $strFind) 
{ 
    $arrFind = explode(' ', $strFind); 
    while ($arrFound !== false and list($key, $strCommand) = each($arrFind)) { 
     $arrSearch = $arrFound['subcommands']; 
     if (($key = binarySearch($arrSearch, $strCommand, 0, count($arrSearch) - 1)) === false) { 
      $arrFound = false; 
     } else { 
      $arrFound = $arrSearch[$key]; 
     } 
    } 
    return $arrFound; 
} 

// get json from file and convert it to an array 
$arrJson = json_decode(file_get_contents('items.json'), true); 

$arrCommand = findCommand($arrJson, 'site create'); 
var_dump($arrCommand); 

$arrCommand = findCommand($arrJson, 'term delete'); 
var_dump($arrCommand); 
0

obwohl mit nativen Funktionen array_search() und array_column() wird wahrscheinlich schneller sein

<?php 
function findCommand($arrFound, $strFind) 
{ 
    $arrFind = explode(' ', $strFind); 
    while ($arrFound !== false and list($key, $strCommand) = each($arrFind)) { 
     $arrSearch = $arrFound['subcommands']; 
     if (($key = array_search($strCommand, array_column($arrSearch, 'name'))) === false) { 
      $arrFound = false; 
     } else { 
      $arrFound = $arrSearch[$key]; 
     } 
    } 
    return $arrFound; 
} 

// get json from file and convert it to an array 
$arrJson = json_decode(file_get_contents('items.json'), true); 

$arrCommand = findCommand($arrJson, 'site create'); 
var_dump($arrCommand); 

$arrCommand = findCommand($arrJson, 'term delete'); 
var_dump($arrCommand);