2

配列から動的なブレッドクラムを作成しようとしています。したがって、配列に追加でき、ブレッドクラムを手動で更新する必要はありません。

さて、これが私の配列のスニペットです:(それはそれほど深くはなりません)

$menu = array(
    'Dashboard' => array(
        'Projects' => array(
            'Project 1' => array(
                'Project settings' => 'projects/project_1/settings',
                'Issue Tracker' => 'projects/project_1/issue_tracker',
                'Customize page' => 'projects/project_1',
                'Manage files' => 'projects/project_1/files',
            ),
            'Project 2' => array(
                'Project settings' => 'projects/project_2/settings',
                'Issue Tracker' => 'projects/project_2/issue_tracker',
                'Customize page' => 'projects/project_2',
                'Manage files' => 'projects/project_2/files',
            ),
        ),
        'Logout' => '#',
    )
);

後で繰り返すことができる方法で、任意のキーのすべての親を返すことができるようにしたいと思います。たとえば、「プロジェクト設定」の場合:

'Dashboard','Projects','Project 1'.
4

1 に答える 1

3

あなたの例では、実際には2つのパスが可能です。

Key 'Project settings' found: 'Projects' -> 'Project 1'
Key 'Project settings' found: 'Projects' -> 'Project 2'

再帰的イテレータを使用してこれを簡単に解決できます(RecursiveIteratorIterator必要なものがすべて提供されていることを確認してください)。親レベルのキーを簡単に検索して取得できるため、これを選択しました。

$search = 'Project settings';
$it     = new ParentKeysIterator($menu);
foreach ($it as $key) {
    if ($key !== $search) continue;
    printf("Key '%s' found: '%s'\n", $key, implode("' -> '", $it->key()));
}

そしてParentKeysIterator

class ParentKeysIterator extends RecursiveIteratorIterator
{
    public function __construct(array $array) {
        parent::__construct(new  RecursiveArrayIterator($array));
    }

    public function current() {
        return parent::key();
    }

    public function key() {
        return $this->getParentKeys();
    }


    public function getParentKeys() {
        $keys = [];
        for ($depth = $this->getDepth() - 1; $depth; $depth--) {
            array_unshift($keys, $this->getSubIterator($depth)->key());
        }
        return $keys;
    }
}
于 2012-12-24T12:10:35.923 に答える