Добрый день,
Я надеюсь, что кто-то может помочь мне с этим …
Я работаю над системой, в которой вы собираете и загружаете тестовые коды, некоторые из тестовых кодов могут быть кодами групп, а групповые коды также могут содержать коды групп. Мне нужно иметь возможность загружать все коды из групп и подгрупп ,
[Test Code] [isGroup] [groupCodes]
TEST Yes Code1,Code2,Code3
Code1 No
Code2 Yes Code4,Code5
Code3 No
Code4 No
Code5 No
Я пробовал несколько вариантов, и некоторые из них я попал в бесконечные циклы.
Вот код, который я сейчас использую, но он не получает подгруппы
function get_group_test_codes($mysqli, $testcode){
$test_codes = array();
$test_data = get_test_by_code($mysqli, $testcode);
if(empty($test_data)){
return $test_codes;
}
if($test_data["isgroup"]==1){
$group_codes = explode(",",$test_data["groupcodes"]);
foreach($group_codes as $group_code){
$test_codes[] = $group_code;
}
} else {
$test_codes[] = $testcode;
}
return $test_codes;
}
function get_test_by_code($mysqli, $testcode){
$data = array();
$sql = "SELECT * FROM `testtypes` where `testcode` = '{$testcode}' limit 1";
$result = $mysqli->query($sql);
while($row = $result->fetch_assoc()){
$data = $row;
}
$result->free();
return $data;
}
Ожидаемый результат должен быть следующим
array('Code1', 'Code3', 'Code4', 'Code5');
Code2 исключен, потому что это групповой код, и должны загружаться только его групповые коды
Требования:
list of entries
которые могут содержать «рекурсивные группы« кодов »…Согласно ОП, коды хранятся в базе данных. Тем не менее, записи считываются по одному «тест-коду» за раз «тест-кодом». Чтобы сделать мою жизнь проще, я настроил массив, эмулировал таблицу базы данных и предоставил функцию readTestCode($testCode)
это можно легко изменить для чтения базы данных вместо массива.
Обработка:
Учитывая testCode
:
/** ------------------------------------------------------------------------
* Given a TestCode - chase it down all the paths...
*
* @param string $testCode
* @param array $outCodes -- cummulative arrat - be reference
*/
function processOneTestCode($testCode, &$outCodes)
{
$curCode = readTestCode($testCode); // get the details for this code
if ($curCode['isGroup']) { // process all the records in the group
foreach ($curCode['groupCode'] as $newCode) {
processOneTestCode($newCode, $outCodes);
}
}
else {
$outCodes[] = $testCode; // add it to the output
}
}
Прочитайте testCode details
разверните группы в список testcode
для удобства обработки …
/** -------------------------------------------------------------------------
* This will be reading one row of the database by TestCode
* This version emulates the database read - accurately I expect! ;)
*
* @global array $dbTestCodes
* @param string $testCode
*
* @return array (isGroup => bool, groupCode = array())
*/
function readTestCode($testCode)
{
global $dbTestCodes; // lose this when using a database.
$details = array();
// put the database read here...
if (isset($dbTestCodes[$testCode])) {
$details = $dbTestCodes[$testCode];
if ($details['isGroup']) { // explode the codes so we can process them easily
$codesList = explode(',', $details['groupCode']);
$details['groupCode'] = $codesList;
}
}
return $details;
}
$outArray = array(); // output in here
/**
* process the one TestCode...
*/
processOneTestCode('TEST', $outArray);
/**
* the processOneTestCode function doesn't do any checks for duplicates...
*
* So we need to remove duplicates and sort it so we can check it easily
*/
$outArray = array_unique($outArray);
sort($outArray);
// show it
echo '<pre>';
print_r($outArray);
echo '</pre>';
exit;
/**
* This is exactly how the database looks when you read it by `testCode`.
*/
$dbTestCodes = array(
'TEST' => array('isGroup' => 1, 'groupCode' => 'CodeC,Code1,CodeB,Code2,Code3'),
'Code1' => array('isGroup' => 0, 'groupCode' => ''),
'Code2' => array('isGroup' => 1, 'groupCode' => 'Code4,Code5'),
'Code3' => array('isGroup' => 0, 'groupCode' => ''),
'Code4' => array('isGroup' => 0, 'groupCode' => ''),
'Code5' => array('isGroup' => 0, 'groupCode' => ''),
'CodeA' => array('isGroup' => 0, 'groupCode' => ''),
'CodeB' => array('isGroup' => 1, 'groupCode' => 'CodeA,CodeD,Code2'),
'CodeC' => array('isGroup' => 0, 'groupCode' => ''),
'CodeD' => array('isGroup' => 0, 'groupCode' => ''),
);
Array
(
[0] => Code1
[1] => Code3
[2] => Code4
[3] => Code5
[4] => CodeA
[5] => CodeC
[6] => CodeD
)
Других решений пока нет …