2016-09-13 5 views
2

Допустим, у меня есть массив, как эторекурсивная функция, которая выводит таблицу ссылок

Array(
    Array("id_1" => 1,"id_2" => 1,"name" => "test1","type" => "A","ref_1" => 0,"ref_2" => 0,), 
    Array("id_1" => 1,"id_2" => 2,"name" => "test2","type" => "B","ref_1" => 1,"ref_2" => 1,), 
    Array("id_1" => 1,"id_2" => 3,"name" => "test3","type" => "B","ref_1" => 1,"ref_2" => 1,), 
    Array("id_1" => 2,"id_2" => 1,"name" => "test4","type" => "B","ref_1" => 1,"ref_2" => 1,), 
    Array("id_1" => 2,"id_2" => 3,"name" => "test5","type" => "C","ref_1" => 1,"ref_2" => 2,), 
    Array("id_1" => 2,"id_2" => 15,"name" => "test6","type" => "C","ref_1" => 1,"ref_2" => 3,), 
    Array("id_1" => 5,"id_2" => 22,"name" => "test7","type" => "B","ref_1" => 4,"ref_2" => 9,), 
    Array("id_1" => 4,"id_2" => 9,"name" => "test8","type" => "C","ref_1" => 1,"ref_2" => 1,), 
    Array("id_1" => 1,"id_2" => 7,"name" => "test9","type" => "C","ref_1" => 2,"ref_2" => 1,), 
    Array("id_1" => 5,"id_2" => 20,"name" => "test10","type" => "B","ref_1" => 4,"ref_2" => 9,), 
    Array("id_1" => 5,"id_2" => 5,"name" => "test11","type" => "B","ref_1" => 4,"ref_2" => 9,), 
    Array("id_1" => 5,"id_2" => 4,"name" => "test12","type" => "B","ref_1" => 1,"ref_2" => 1,), 
); 

Два «первичные ключи», которые «ID_1» и «ID_2», сочетание обоих не может быть повторен. На каждую строку можно ссылаться другой, используя «ref_1» и «ref_2», ссылочная строка будет содержать форму «id_1» и «id_2» от рефератора (отца).

Строки типа A не могут быть указаны. Тип B & C может ссылаться на A. Также на B можно ссылаться на C и наоборот. Дерево не всегда является полным, он может иметь только TYPE A и B или TYPE A и C, или просто TYPE A.

Я пытаюсь сделать функцию, которая возвращает таблицу, как это:

| TYPE A NAME | TYPE B NAME | TYPE C NAME | 
| ------------------------------------------- | 
| test1  | test2  | test5  | 
| test1  | test3  | test6  | 
| test1  | test7  | test8  | 
| test1  | test4  | test9  | 
| test1  | test10  | test8  | 
| test1  | test11  | test8  | 
| test1  | test12  |    | 

Каждый раз, когда строка ссылается на две (или более) строки, данные являются отпечатками отца и выдает одну строку для каждой ссылки. Если референты типа A 2 типа B и каждый тип B ссылаются на другие 2 типа C, выходная таблица будет иметь 4 строки.

Существует более трех типов, это просто PoC. Я попытался объяснить это как можно более подробно, но это может быть трудно понять. Я знаю, что это может быть связано с рекурсией, но я пробовал последние 8 часов и не мог выполнить эту работу.

PS: Выход может быть массивом тоже.

Если необходима дополнительная информация, пожалуйста, дайте мне знать.

ответ

1

Ну, наконец, я получил его работу. Я добавил некоторую информацию, чтобы облегчить мне жизнь.

Я добавил флаг в каждую строку, в которой говорится, что в этой строке нет дочерних элементов (так что это последний). Количество «последних» строк - это количество строк выходного файла, поэтому я начал с него.

Кроме того, я добавил «ключ», который является «id_1-id_2» для каждой строки.

Вот полный код:

$Adata = Array(
    "1-1" => Array("id_1" => 1,"id_2" => 1,"name" => "test1", "type" => "A","ref_1" => 0,"ref_2" => 0,"last" => false), 
    "1-2" => Array("id_1" => 1,"id_2" => 2,"name" => "test2", "type" => "B","ref_1" => 1,"ref_2" => 1,"last" => false), 
    "1-3" => Array("id_1" => 1,"id_2" => 3,"name" => "test3", "type" => "B","ref_1" => 1,"ref_2" => 1,"last" => false), 
    "2-1" => Array("id_1" => 2,"id_2" => 1,"name" => "test4", "type" => "B","ref_1" => 1,"ref_2" => 1,"last" => false), 
    "2-3" => Array("id_1" => 2,"id_2" => 3,"name" => "test5", "type" => "C","ref_1" => 1,"ref_2" => 2,"last" => true), 
    "2-15" => Array("id_1" => 2,"id_2" => 15,"name" => "test6", "type" => "C","ref_1" => 1,"ref_2" => 3,"last" => true), 
    "5-22" => Array("id_1" => 5,"id_2" => 22,"name" => "test7", "type" => "B","ref_1" => 4,"ref_2" => 9,"last" => true), 
    "4-9" => Array("id_1" => 4,"id_2" => 9,"name" => "test8", "type" => "C","ref_1" => 1,"ref_2" => 1,"last" => false), 
    "1-7" => Array("id_1" => 1,"id_2" => 7,"name" => "test9", "type" => "C","ref_1" => 2,"ref_2" => 1,"last" => true), 
    "5-20" => Array("id_1" => 5,"id_2" => 20,"name" => "test10", "type" => "B","ref_1" => 4,"ref_2" => 9,"last" => true), 
    "5-5" => Array("id_1" => 5,"id_2" => 5,"name" => "test11", "type" => "B","ref_1" => 4,"ref_2" => 9,"last" => true), 
    "5-4" => Array("id_1" => 5,"id_2" => 4,"name" => "test12", "type" => "B","ref_1" => 1,"ref_2" => 1,"last" => true), 
); 

$Atable = Array(); 
foreach ($Adata as $key=>$data){ 
    if (!$data['last']){ 
     continue; 
    } 
    $output = Array('A'=>'','B'=>'','C'=>''); 
    echo "SAVE {$data['type']} - {$data['name']}<br>"; 
    $output[$data['type']] = $data['name']; 

    $referer = $data; 
    do { 
     $referer = $Adata["{$referer['ref_1']}-{$referer['ref_2']}"]; 
     $output[$referer['type']] = $referer['name']; 
    } while (!empty($referer['ref_1']) && !empty($referer['ref_2'])); 

    $Atable[] = $output; 
} 

foreach ($Atable as $row){ 
    echo "{$row['A']}-{$row['B']}-{$row['C']}<br>"; 
} 
Смежные вопросы