Пользовательский тип данных PHP для многомерных массивов

Я много работаю с многомерными ассоциативными массивами, в основном для данных конфигурации, и ввел «хлебные крошки» в использование многомерных массивов. Основная идея: мои классы предназначены для обработки одномерных (плоских) массивов хлебных крошек в качестве справочного руководства для определенных значений внутри многомерного ассоциативного массива. Каждый увеличенный индекс хлебной крошки в основном представляет собой уровень глубже внутри массива, пока последний уровень и ассоциативный ключ не будут найдены и достигнуты в рекурсии. Например.:

$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» и «Итератор» и соответствует именно тому, что я искал в этой ветке вопросов.

http://php.net/manual/de/class.arrayaccess.php

http://php.net/manual/de/class.judy.php


person Sebastian    schedule 08.07.2014    source источник


Ответы (1)


В зависимости от вашего варианта использования я бы порекомендовал вам изучить итераторы PHP SPL. В частности, интерфейс рекурсивного итератора или RecursiveArrayIterator. Эти итераторы изначально встроены в PHP, работают очень быстро, и многие из них позволяют вам обращаться к ним с помощью встроенных функций PHP, таких как foreach(), for(), count() и т. д.

Затем вы можете расширить один из интерфейсов итератора SPL, чтобы создать собственный пользовательский класс, предоставляющий вам функциональные возможности, соответствующие вашим потребностям Breadcrumb. FWIW, я полагаю, что разработчики не должны создавать свои собственные нативные типы данных в PHP (потому что вы не можете), но создание пользовательских типов с классами PHP настоятельно рекомендуется вместо использования собственных массивов.

person Konr Ness    schedule 08.07.2014
comment
Большое вам спасибо, это решает проблему необходимости изменения синтаксиса и добавления еще одного уровня абстракции к справочному доступу, что в конечном итоге только запутает других программистов, а не поможет с логикой. С помощью RecursiveArrayIterator я могу, по крайней мере, создать стандартизированное решение, которое можно будет использовать во всех проектах. - person Sebastian; 10.07.2014