PHP:一个数组在键值对中可以有一个数组作为键吗?

9

我在这个数组中得到了一个“非法偏移类型”的错误:

public static $CATS_AND_TYPES = array(

        // Statement Administration
        array( self::CAT_STATEMENT_ADMIN => "Document Administration" ) => array(
            self::TYPE_STATEMENTS_LOADED => "Documents Loaded",
            self::TYPE_STATEMENTS_REMOVED => "Documents Removed"
        ),

        // Cron Jobs
        array( self::CAT_CRON_JOBS => "Cron Jobs" ) => array(
            self::TYPE_CRON_BULLETIN_RUN => "Bulletin Cron Job Ran",
            self::TYPE_CRON_EMAILER_RUN => "Emailer Cron Job Ran",
            self::TYPE_CRON_SURVEY_RUN => "Survey Cron Job Ran",
            self::TYPE_CRON_JOURNEY_RUN => "Journey Cron Job Ran",
            self::TYPE_CRON_DOCUMENT_RUN => "Document Cron Job Ran"
        ),

        // Global Administration
        array( self::CAT_GLOBAL_ADMIN => "Global Administration" ) => array(
            self::TYPE_GLOBAL_MAINTENANCE => "Global Maintenance",
            self::TYPE_GLOBAL_EMAIL_SENDING => "Email Sending"
        ),

        // Email Administration
        array( self::CAT_EMAIL_ADMIN => "Email Administration" ) => array(
            self::TYPE_EMAIL_SENT => "Email Sent",
            self::TYPE_EMAIL_RESENT => "Email Resent",
            self::TYPE_EMAIL_REMOVED => "Email Removed"
        ),

        // DCVs Administration
        array( self::CAT_DCVS_ADMIN => "DCVs Administration" ) => array(
            self::TYPE_DCVS_FLEX_UPDATED => "Flexible Variables Updated",
            self::TYPE_DCVS_GLOBAL_UPDATED => "Global Variables Updated"
        ),

        // Video Administration
        array( self::CAT_VIDEO_ADMIN => "Video Administration" ) => array(
            self::TYPE_VIDEO_ADDED => "Video Added",
            self::TYPE_VIDEO_EDITED => "Video Edited",
            self::TYPE_VIDEO_REMOVED => "Video Removed"
        ),

        // Bulletin Board Administration
        array( self::CAT_BULLETIN_BOARD => "Bulletin Board Administration" ) => array(
            self::TYPE_BULLETIN_DELETED => "Message Deleted",
            self::TYPE_BULLETIN_EDITED => "Message Edited",
            self::TYPE_BULLETIN_ADDED => "Message Added"
        ),

        // User Administration
        array( self::CAT_USER_ADMIN => "User Administration" ) => array(
            self::TYPE_USER_ADDED => "User Added",
            self::TYPE_USER_ADDED_MULTI => "Multiple Users Added",
            self::TYPE_USER_REMOVED => "User Removed",
            self::TYPE_USER_REMOVED_MULTI => "Multiple Users Removed",
            self::TYPE_USER_UPDATED => "User Updated"
        ),

        // Survey Administration
        array( self::CAT_SURVEY_ADMIN => "Survey Administration" ) => array(
            self::TYPE_SURVEY_ADDED => "Survey Added",
            self::TYPE_SURVEY_UPDATED => "Survey Updated",
            self::TYPE_SURVEY_REMOVED => "Survey Removed",
            self::TYPE_SURVEY_REMOVED_MULTI => "Multiple Surveys Removed"
        )
    );

在这里定义键值对时,需要创建另一个数组来定义正在定义的内容,这有点烦人,所以我想知道这是否是我的问题。如果是的话,我想我将不得不为类别ID和字符串值创建一个键值数组。

谢谢!


我可以问一下原因吗?在您的示例中,每个元素的键始终不同。因此,为什么不直接使用self :: CAT_USER_ADMIN,而不是执行array(self :: CAT_USER_ADMIN =>'User Admin') - ircmaxell
3个回答

8
您遇到了一个“非法偏移类型”错误,因为数组键只能是标量值。根据关于数组的文档

键可以是整数或字符串。如果键是整数的标准表示,则将被解释为该整数(即“8”将被解释为8,而“08”将被解释为“08”)。键中的浮点数将被截断为整数。

既然self::CAT_CRON_JOBS等似乎应该是常量,为什么不定义它们,使其值为描述文本,然后您就可以像这样指定您的数组:

const CAT_STATEMENT_ADMIN = "Document Administration";

public static $CATS_AND_TYPES = array(

  // Statement Administration
  self::CAT_STATEMENT_ADMIN => array(
    self::TYPE_STATEMENTS_LOADED => "Documents Loaded",
    self::TYPE_STATEMENTS_REMOVED => "Documents Removed"
  ),

  // etc.
)

你可以使用 $CATS_AND_TYPES[self::CAT_STATEMENT_ADMIN](当然是在类内部)或者 $CATS_AND_TYPES['Document Administration'] 来获取相同的数组元素。


谢谢!至于你的想法,我已经将常量设置为整数并将其存储在我的数据库中作为键。我认为这样搜索整数键更有效率,而且如果名称需要更改,它不会影响数据库数据。感谢你的帮助! - Garrett
@Garrett 同意。我没有意识到常量对应于数据库值。既然如此,如果您需要描述信息,可以像其他地方提到的那样将它们存储在第二个数组中。 - Daniel Vandersluis

3

不可以。数组只能有整数和字符串作为键。

你可以使用SplObjectStorage来模拟数组,并使用对象作为键。但是不能使用数组作为键。


1

我认为这是你的问题 :P

我会这样解决这个问题

public static $CATS_AND_TYPES = array(

    self::CAT_STATEMENT_ADMIN => array(
        self::TYPE_STATEMENTS_LOADED,
        self::TYPE_STATEMENTS_REMOVED
    ),

    // ...
);

public static $TRANSLATIONS = array(
    self::CAT_STATEMENT_ADMIN => 'Email Administration',
    self::TYPE_STATEMENTS_LOADED = "Documents Loaded",
// ...

我猜这基本上就是你所说的“创建另一个数组”的意思。这是解决问题的正确方法,因为它将翻译和层次结构信息分开。

想象一下,当你想要将你的项目翻译成另一种语言时。如果你雇了一个翻译员,他不应该需要了解你的项目层次结构,因为他只需要进行翻译。你也可以将$TRANSLATIONS提取到另一个文件中,这样你就可以将该文件分发给99个翻译员,你的项目就可以在一天内变成多语言!

如果你愿意的话,你可以将你的数组序列化为标量值,使其可以充当键。

// Untested
public static $CATS_AND_TYPES = array(
    serialize(array(self::CAT_STATEMENT_ADMIN=>"Documents and Administration")) => array(
        self::TYPE_STATEMENTS_LOADED => "Documents Loaded"
        // ...
    )
);

// You can later get back the values
foreach(self::CATS_AND_TYPES as $k=>$v)
{
    $title = unserialize($k);
    displayTitle($title[0]);

    foreacH($v as $bar) displaySubtitle($bar);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接