Skip to content

Instantly share code, notes, and snippets.

@ttskch
Last active August 29, 2015 14:18
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ttskch/a35735da3e7000052fa5 to your computer and use it in GitHub Desktop.
Save ttskch/a35735da3e7000052fa5 to your computer and use it in GitHub Desktop.
Nagoya.php vol.9 プログラミング問題

初級編

  • 自分の id
  • 親の id(親がいなければ 0)
  • 自分の値

を持った配列を一つの塊としたときに、複数の塊が並んでいるような二次元配列があるとします。(以下のような形)

<?php
$data = [
    [
        'id' => 1,
        'parent_id' => 0,
        'value' => '親1',
    ],
    [
        'id' => 2,
        'parent_id' => 0,
        'value' => '親2',
    ],
    [
        'id' => 3,
        'parent_id' => 1,
        'value' => '子1-1',
    ],
    [
        'id' => 4,
        'parent_id' => 1,
        'value' => '子1-2',
    ],
    [
        'id' => 5,
        'parent_id' => 2,
        'value' => '子2-1',
    ],
];

この形式の配列を入力したときに、HTML の <ul> <li> タグを使って階層的なリストを表示する機能を実装してください。

出力する HTML コード

<ul>
    <li>親1
        <ul>
            <li>子1-1</li>
            <li>子1-2</li>
        </ul>
    </li>
    <li>親2
        <ul>
            <li>子2-1</li>
        </ul>
    </li>
</ul>

表示結果

image

要件

  • 階層の深さは、親と子の 2 階層しかないものとしてよい
  • 入力される配列の構造エラーなどは考慮しなくてよい
  • id 順で並んでいる必要は特にない

応用編

初級編ができた人は、さらに以下のような改良を加えてみてください。

1. 無限に深い階層への対応

再帰処理を用いて、無限に深い階層を処理できるよう改良してみてください。

例えば以下のような入力に対応できれば十分でしょう。

入力例

<?php
$data = [
    [
        'id' => 1,
        'parent_id' => 0,
        'value' => '親1',
    ],
    [
        'id' => 2,
        'parent_id' => 0,
        'value' => '親2',
    ],
    [
        'id' => 3,
        'parent_id' => 1,
        'value' => '子1-1',
    ],
    [
        'id' => 4,
        'parent_id' => 1,
        'value' => '子1-2',
    ],
    [
        'id' => 5,
        'parent_id' => 2,
        'value' => '子2-1',
    ],
    [
        'id' => 6,
        'parent_id' => 4,
        'value' => '孫1-2-1',
    ],
    [
        'id' => 7,
        'parent_id' => 3,
        'value' => '孫1-1-1',
    ],
    [
        'id' => 8,
        'parent_id' => 7,
        'value' => 'ひ孫1-1-1-1',
    ],
    [
        'id' => 9,
        'parent_id' => 5,
        'value' => '孫2-1-1',
    ],
    [
        'id' => 10,
        'parent_id' => 5,
        'value' => '孫2-1-2',
    ],
    [
        'id' => 11,
        'parent_id' => 2,
        'value' => '子2-2',
    ],
    [
        'id' => 12,
        'parent_id' => 4,
        'value' => '孫1-2-2',
    ],
    [
        'id' => 13,
        'parent_id' => 9,
        'value' => 'ひ孫2-1-1-1',
    ],
    [
        'id' => 14,
        'parent_id' => 5,
        'value' => '孫2-1-3',
    ],
    [
        'id' => 15,
        'parent_id' => 2,
        'value' => '子2-3',
    ],
];

表示結果

image

2. ブラウザで実行した場合と CLI で実行した場合で出力形式を変える

CLI から実行した場合には HTML ではなく改行とインデントを使って表示されるように改良してみてください。

例えば以下のような形式で出力できればよいでしょう。

CLI 出力例

* 親1
  * 子1-1
    * 孫1-1-1
      * ひ孫1-1-1-1
  * 子1-2
    * 孫1-2-1
    * 孫1-2-2
* 親2
  * 子2-1
    * 孫2-1-1
      * ひ孫2-1-1-1
    * 孫2-1-2
    * 孫2-1-3
  * 子2-2
  * 子2-3

時間内に応用編まで終わった人は、ぜひ周りの人たちに教えてあげてください!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment