PHP 枚举层次结构

标签 php reflection enums hierarchy

我想为我的 PHP 应用程序创建分层枚举并想到类似的事情

abstract class User_Roles extends Enum {

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

}

我正在使用这个枚举类:SO

所以每个 child 都有他的父节点作为它的值(value)。

我会这样做:

    $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
  )
)

有什么我误解或忽略的地方吗?

最佳答案

如果你的 $value 角色已经存在,你必须遍历 $contstants 并在你的 $returnHierarchy 中搜索 append if no create new

要在数组中搜索,您必须使用递归函数,它将返回匹配的子数组索引引用

// 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);

$returnHierarchy 的 var_dump 将是

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

关于PHP 枚举层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35398436/

相关文章:

java - Jackson 反序列化子类型将枚举字段设置为 null

java - Hibernate 'tableless' 枚举映射?

c++ - 在 C++98 和 C++11 中访问枚举值

php - Heroku PHP 托管超时

php - 分页和 where 子句

c++ - 如何从 C++ 运行 C++ 代码?

Java 反射输出

javascript - 使用 javascript(api?) 调用网站并抓取文本

java - 在 VPS 上运行 Solr 问题

c# - 如何使用代码生成动态创建C#方法?