массивы — PHP Рекурсивные данные

Добрый день,
Я надеюсь, что кто-то может помочь мне с этим …

Я работаю над системой, в которой вы собираете и загружаете тестовые коды, некоторые из тестовых кодов могут быть кодами групп, а групповые коды также могут содержать коды групп. Мне нужно иметь возможность загружать все коды из групп и подгрупп ,

[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 исключен, потому что это групповой код, и должны загружаться только его групповые коды

0

Решение

Требования:

  • С учетом записи кода TEST, хранящейся в list of entries которые могут содержать «рекурсивные группы« кодов »…
  • Вернуть список всех «TestCode», которые являются членами «группы», но сами не являются «группой».

Согласно ОП, коды хранятся в базе данных. Тем не менее, записи считываются по одному «тест-коду» за раз «тест-кодом». Чтобы сделать мою жизнь проще, я настроил массив, эмулировал таблицу базы данных и предоставил функцию readTestCode($testCode) это можно легко изменить для чтения базы данных вместо массива.

Обработка:

Учитывая 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
)
0

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

Других решений пока нет …

По вопросам рекламы [email protected]