0

次のような形式の大量のレガシー データがあります。

Name         | Bid      
-----------------------
Animal       | 1
Canine       | 11
Dog          | 111
Bulldog      | 1111
Wolf         | 112
Hyena        | 113
Feline       | 12
Cat          | 121
Lion         | 122

フィールドは、カテゴリの関係を説明する文字列です。Bidつまり、データ構造は次のようになります。

Animal
  Canine
    Dog
      Bulldog
    Wolf
    Hyena
  Feline
    Cat
    Lion

データから配列ツリーを構築する最良の方法は何ですか? ソース データが 1 次元であるため、再帰の使用が困難です。私はしばらくループのロジックを考え出そうとしましたが、合理的な解決策は思いつきませんでした。

4

1 に答える 1

1
$data = array(
  array('Name' => 'Animal',  'Bid' => '1'  ),
  array('Name' => 'Canine',  'Bid' => '11'  ),
  array('Name' => 'Dog',     'Bid' => '111' ),
  array('Name' => 'Bulldog', 'Bid' => '1111'),
  array('Name' => 'Wolf',    'Bid' => '112' ),
  array('Name' => 'Hyena',   'Bid' => '113' ),
  array('Name' => 'Feline',  'Bid' => '12'  ),
  array('Name' => 'Cat',     'Bid' => '121' ),
  array('Name' => 'Lion',    'Bid' => '122' ),
);


$struct = array(
  'children' => array()
);

foreach ($data as $entry) {
  $parent =& $struct;

  foreach (str_split($entry['Bid'], 1) as $val) {
    if (!isset($parent['children'][$val])) {
      // if not, we create an empty entry
      $parent['children'][$val] = array(
        'entry' => array(),  // no content
        'children' => array()  // no children
      );
    }

    $parent =& $parent['children'][$val];
  }

  $parent['entry'] = $entry;
}

print_r($struct);

そして使用:

function render($elements, $depth = 0) {
  foreach ($elements as $element) {
    printf("%s%s\n", str_repeat(' ', $depth * 2), $element['entry']['Name']);
    render($element['children'], $depth + 1);
  }
}

render($struct['children']);

あなたが得るでしょう:

Animal
  Canine
    Dog
      Bulldog
    Wolf
    Hyena
  Feline
    Cat
    Lion
于 2012-05-02T10:53:27.780 に答える