отражение — PHP Enum Hierarchy

Я хочу создать иерархические перечисления для моих приложений PHP и думать о вещах, таких как

abstract class User_Roles extends Enum {

const Administrator = "";
const Account_Manager = "Administrator";
const BlogAuthor = "Account_Manager";
const CommentManager = "Account_Manager";

}

Я использую этот Enum-класс: ТАК

Таким образом, у каждого ребенка есть родительский узел, так как это значение.

Вот как я бы это сделал:

    $constants = $reflector->getConstants();
foreach ($constants as $key => $value) {
if ($value == "") {
$returnHierarchy[$key] = array();
continue;
}
$returnHierarchy[][$value] = $key;
}

Но у меня есть некоторые проблемы с многомерным массивом, который я хочу создать.

Так должно выглядеть так:

[Administrator]
{
[Account_Manager]
{
[BlogAuthor]
[CommentManager]
}
}

Но я в конечном итоге в таких вещах:

array(4) (
[Administrator] => array(0)
[0] => array(1) (
[Administrator] => (string) Account_Manager
)
[1] => array(1) (
[Account_Manager] => (string) BlogAuthor
)
[2] => array(1) (
[Account_Manager] => (string) CommentManager
)
)

Есть ли что-то, что я неправильно понимаю или упускаю из виду?

4

Решение

Вы должны зациклить $contstants и искать внутри вашего $returnHierarchy если твой $value Роль уже там добавляется, если нет создать новую

Для поиска в массиве вы должны использовать рекурсивную функцию, которая будет возвращать ссылку на индекс совпадения подмассива

// IMPORTANT: it return reference function mae mast start with &
function &searchKeyInArray($key, &$array){

$matchedArrayReffarance = null;

if( !isset($array[$key]) ){

foreach ($array as &$sub){

if(is_array($sub)){
$matchedArrayReffarance = &searchKeyInArray($key, $sub);
}
}
}else{
$matchedArrayReffarance = &$array;
}

return $matchedArrayReffarance;
}

Тогда просто используя выше определенное searchKeyInArray Вы можете достичь того, что вы ищете

$returnHierarchy = array();
// This is example, in your case it is: $constants = $reflector->getConstants();
$constants = array(
'Administrator' => "",
'Account_Manager' => "Administrator",
'BlogAuthor' => "Account_Manager",
'CommentManager' => "Account_Manager",
);

foreach ($constants as $key => $value) {

$matchArray = &searchKeyInArray($value, $returnHierarchy);

if( isset($matchArray) ){
$matchArray[$value][$key] = array();
}else{
$returnHierarchy[$key] = array();
}
}

var_dump($returnHierarchy);

Var_dump of $returnHierarchy будет

array(1) {
["Administrator"]=> &array(1) {
["Account_Manager"]=> array(2) {
["BlogAuthor"]=> array(0) { }
["CommentManager"]=> array(0) { }
}
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector