PHP: Может ли массив иметь массив как ключ в паре ключ-значение?

Я получаю «Недопустимый тип смещения» для этого массива:

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

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

благодаря!

Вы получаете illegal offset type ошибку illegal offset type потому что ключи массива могут быть только скалярными значениями. Из документации по массивам:

Ключ может быть целым числом или строкой. Если ключ является стандартным представлением целого числа, он будет интерпретироваться как таковой (т.е. «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'] чтобы получить тот же элемент массива.

Нет. Массивы могут содержать только целые числа и строки.

Вы можете имитировать массивы и использовать объекты в качестве ключей с помощью SplObjectStorage . Однако никаких массивов.

Я думаю, это ваша проблема: 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); }