Я много работаю с многомерными ассоциативными массивами, в основном для данных конфигурации, и ввел «хлебные крошки» в использование многомерных массивов. Основная идея: мои классы предназначены для обработки одномерных (плоских) массивов хлебных крошек в качестве справочного руководства для определенных значений внутри многомерного ассоциативного массива. Каждый увеличенный индекс хлебной крошки в основном представляет собой уровень глубже внутри массива, пока последний уровень и ассоциативный ключ не будут найдены и достигнуты в рекурсии. Например.:
$myArray = array(
'firstLevel' => array(
'secondLevel' => array(
'myValue' => 42
),
'anotherLevel' => array(
'anotherValue' => 13
)
)
);
$myBreadcrumb = array('firstLevel', 'secondLevel', 'myValue');
$fancyClass = new \someNamespace\fancyArrayProcessingClass($myArray);
$myValue = $fancyClass->getValueForBreadcrumb($myBreadcrumb);
Если потребуется, я также опубликую пример обработки хлебных крошек, но, поскольку я ориентируюсь на пользовательские типы данных, я обнаружил, что это не по теме. Становится утомительно и накладно всегда кодировать классы-оболочки, реализованные классы или другую конструкцию, чтобы сделать массивы доступными для навигации через навигационную крошку. Я задавался вопросом, есть ли способ ввести в PHP настоящие новые типы данных, которые можно обрабатывать как настоящие типы данных. Моя идея хорошего синтаксиса для этой концепции:
$myArray = navigableArray(
'firstLevel' => array(
'secondLevel' => array(
'myValue' => 42
),
'anotherLevel' => array(
'anotherValue' => 13
)
)
);
$myBreadcrumb = array('firstLevel', 'secondLevel', 'myValue');
$myValue = $myArray[$myBreadcrumb];
Или даже более интуитивно понятный для использования только строк в стиле xpath:
$myArray = navigableArray(
'firstLevel' => array(
'secondLevel' => array(
'myValue' => 42
),
'anotherLevel' => array(
'anotherValue' => 13
)
)
);
$myValue = $myArray['firstLevel/secondLevel/myValue'];
Я знаю, что в документации по PHP есть предложение, в котором говорится что-то вроде «разработчикам никогда не понадобится вводить свои собственные типы данных в PHP», но, насколько мне известно, нет причин, почему это так и почему разработчик - в отличие от почти любой другой язык - невозможно ввести полностью настраиваемые типы данных.
Изменить: для всех любопытных: я нашел альтернативный маршрут со стандартным классом php «ArrayAccess», вы можете заставить свой PHP-объект вести себя как настоящий массив. Знаменитый класс «Джуди» включает в себя «ArrayAccess» и «Итератор» и соответствует именно тому, что я искал в этой ветке вопросов.