у меня есть это JSON Вот
В корне есть команда (свойство) как wp
который имеет 39 подкоманд (под-свойств) как cache
, cap
, checksum
… и т. д., где у каждой есть свои подкоманды, и это доходит до 4 уровней
Самое приятное то, что все подкоманды расположены в порядке возрастания, т.е. Строки расположены в порядке возрастания.
Я хочу пройти и искать, как команда, как wp site create
или же wp term delete
существует в дереве JSON. Я не хочу повторять, используя for
цикл из-за огромной сложности времени. Прошло слишком много времени с тех пор, как я закончил разработку, и если бы моя память работала правильно, древовидная структура могла бы значительно сократить время поиска.
Кто-нибудь может указать мне правильное направление на достижение этого? Я использую PHP как мой язык.
вот решение для бинарного поиска, вам нужно поместить свой 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);
хотя с использованием нативных функций 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);