2010-08-17 12 views
8

Recibo un "Illegal offset tipo" de esta matriz:PHP: ¿Puede una matriz tener una matriz como clave en un par clave-valor?

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

que es un poco molesto para hacer otra matriz sólo para definir lo que se define en las llaves aquí, así que me preguntaba si eso era mi problema. si es así, supongo que tendré que hacer una matriz de clave-valor para las categorías ID y valores de cadena.

gracias!

+0

¿Puedo preguntar por qué? En su ejemplo, las claves son siempre diferentes para cada elemento. Entonces, en lugar de hacer 'array (self :: CAT_USER_ADMIN => 'User Admin')', ¿por qué no usar 'self :: CAT_USER_ADMIN'? – ircmaxell

Respuesta

7

Obtiene un error illegal offset type porque las claves de matriz solo pueden ser valores escalares. Desde documentation en matrices:

Una clave puede ser un entero o una cadena. Si una clave es la representación estándar de un entero, se interpretará como tal (es decir, "8" se interpretará como 8, mientras que "08" se interpretará como "08"). Los flotantes en la clave se truncan en enteros.

Desde self::CAT_CRON_JOBS y col. parecer como que deben ser constantes de todos modos, ¿por qué no los definen de modo que su valor es el texto de la descripción, y entonces se podría simplemente especificar la matriz como

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

Y entonces se podría utilizar cualquiera $CATS_AND_TYPES[self::CAT_STATEMENT_ADMIN] (dentro de la clase, por supuesto) o $CATS_AND_TYPES['Document Administration'] para obtener el mismo elemento de matriz.

+0

gracias! y en cuanto a su idea, tengo las constantes establecidas en enteros que almaceno en mi base de datos como claves. Creo que es más eficiente buscar claves int que string, además si el nombre necesita ser cambiado, no afectará los datos de la base de datos. ¡gracias por tu ayuda! – Garrett

+0

@Garrett De acuerdo. No me di cuenta de que las constantes correspondían a los valores de la base de datos. En ese caso, si necesita las descripciones, puede almacenarlas en una segunda matriz como se menciona en otra parte. –

1

No. Las matrices solo pueden tener enteros y cadenas como claves.

Puede simular matrices y usar objetos como claves con SplObjectStorage. Sin arreglos, sin embargo.

+1

O su propia clase que extiende 'ArrayAccess' ... – ircmaxell

1

Creo que es su problema: P

Me gustaría enfocar el problema como éste

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", 
// ... 

supongo que es básicamente lo que entiende por "hacer otra matriz." Este es el enfoque correcto del problema porque separa la traducción y la información jerárquica.

Imagine que desea traducir su proyecto a otro idioma. Si contrató a un traductor, no debería necesitar conocer la estructura jerárquica de su proyecto porque solo debe traducir. ¡También puede extraer $TRANSLATIONS en otro archivo para que pueda distribuir ese archivo a 99 traductores y su proyecto será multilingüe en un día!

Si lo desea, puede serializar su matriz en un valor escalar para que pueda actuar como una clave.

// 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); 
} 
Cuestiones relacionadas