Оптимизируйте поиск в JSON со строками в порядке возрастания

у меня есть это JSON Вот

В корне есть команда (свойство) как wp который имеет 39 подкоманд (под-свойств) как cache, cap, checksum… и т. д., где у каждой есть свои подкоманды, и это доходит до 4 уровней

Самое приятное то, что все подкоманды расположены в порядке возрастания, т.е. Строки расположены в порядке возрастания.

Я хочу пройти и искать, как команда, как wp site create или же wp term delete существует в дереве JSON. Я не хочу повторять, используя for цикл из-за огромной сложности времени. Прошло слишком много времени с тех пор, как я закончил разработку, и если бы моя память работала правильно, древовидная структура могла бы значительно сократить время поиска.

Кто-нибудь может указать мне правильное направление на достижение этого? Я использую PHP как мой язык.

0

Решение

вот решение для бинарного поиска, вам нужно поместить свой JSON в файл …
ПРИМЕЧАНИЕ: потому что wp не в subcommands массив вы не можете найти его

<?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

Другие решения

хотя с использованием нативных функций array_search () а также array_column () вероятно будет быстрее

<?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);
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector