【问题标题】:PHP Enum HierarchyPHP 枚举层次结构
【发布时间】:2016-05-25 17:13:51
【问题描述】:

我想为我的 PHP 应用程序创建分层枚举并考虑类似

abstract class User_Roles extends Enum {

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

}

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

所以每个孩子都有他的父节点作为它的价值。

我会这样做:

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

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

【问题讨论】:

    标签: php reflection enums hierarchy


    【解决方案1】:

    如果您的$value 角色已经存在,则您必须遍历$contstants 并在您的$returnHierarchy 中搜索,如果没有则添加新角色

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

    // 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) { } 
              } 
        } 
    }
    

    【讨论】:

    • 您好,Armen,感谢您的回答。但是您能否添加运行时获得的输出?当我运行它时,我会得到与问题所示几乎相同的输出。将不胜感激:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    相关资源
    最近更新 更多