PHP: может ли массив иметь массив в качестве ключа в паре ключ-значение? - PullRequest
9 голосов
/ 17 августа 2010

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

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

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

спасибо!

Ответы [ 3 ]

8 голосов
/ 17 августа 2010

Вы получаете ошибку 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'], чтобы получить тот же элемент массива.

2 голосов
/ 17 августа 2010

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

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

1 голос
/ 17 августа 2010

Я думаю, что это ваша проблема: 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...