Я пытаюсь создать динамические панировочные сухари из массива. Поэтому я могу добавить в массив и не вручную обновлять панировочные сухари.
Хорошо, вот фрагмент моего массива: (Он не будет намного глубже)
$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'.
В вашем примере возможны два пути:
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; } }