如何将php枚举转换为数组?

时间:2017-03-08 17:19:11

标签: php arrays enums spl

我得到了以下枚举:

abstract class DaysOfWeek
{
    const Sunday = 0;
    const Monday = 1;
    // etc.
}

如何修改以下函数以根据上面的enum生成数组?

public function getOptions()
{
    return [
        0 => 'Sunday',
        1 => 'Monday',
    ];
}

为此目的使用SplEnum是否更好?

2 个答案:

答案 0 :(得分:2)

我不确定使用Splenum是否更好,但我知道可以使用ReflectionClass来完成。假设您希望在扩展DaysOfWeek的类中定义getOptions,您的代码可能如下所示:

abstract class DaysOfWeek
{
    const Sunday = 0;
    const Monday = 1;
    // etc.
}


class myClass extends DaysOfWeek {
    public function getOptions() {
            $oClass = new ReflectionClass(__CLASS__);
            $constants = $oClass->getConstants();
            $retval = array();
            foreach($constants as $name => $val) {
                    $retval[$val] = $name;
            }
            return $retval;
    }
}

$o = new myClass();
var_dump($o->getOptions());

编辑:这是一个更紧凑,更高效的getOptions函数版本,它使用本机PHP函数:

    public function getOptions() {
            $oClass = new ReflectionClass(__CLASS__);
            $constants = $oClass->getConstants();
            return(array_combine(array_values($constants), array_keys($constants)));
    }

编辑2:如果getOptions在一个不扩展DaysOfWeek的类中,你可以简单地引用类名:

class AnotherClass {
    public function getOptions() {
            $oClass = new ReflectionClass(DaysOfWeek);
            $constants = $oClass->getConstants();
            return(array_combine(array_values($constants), array_keys($constants)));
    }
}

$o = new AnotherClass();
var_dump($o->getOptions());

答案 1 :(得分:0)

如果您愿意,可以使用SplEnum,但我觉得很难使用。我更喜欢Eloquent Enumeration,因为它支持C ++样式和Java样式枚举,并提供了一系列获取值的方法。

如果你想自己动手,可以使用ReflectionClass来检查常量,但要注意,如果你有一个增加常量的继承树,你必须是{{3} }}。否则,bit clever的答案就足够了。