2010-08-17 15 views
8

Ich erhalte eine für dieses Array „Illegal Art Offset“:PHP: Kann ein Array ein Array als Schlüssel in einem Schlüssel/Wert-Paar haben?

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

es ist irgendwie ärgerlich andere Array nur, um zu definieren, was hier in den Schlüssel definiert wird, so dass ich frage mich, ob das war mein Problem. Wenn es so ist, muss ich ein Schlüssel-Wert-Array für die Kategorien Ids und String-Werte erstellen.

danke!

+0

Kann ich fragen warum? In Ihrem Beispiel sind die Schlüssel für jedes Element immer unterschiedlich. Anstatt »array (self :: CAT_USER_ADMIN => 'User Admin')' zu benutzen, warum sollte man nicht einfach 'self :: CAT_USER_ADMIN' verwenden? – ircmaxell

Antwort

7

Sie erhalten einen illegal offset type Fehler, da Array-Schlüssel nur skalare Werte sein können. Von der documentation auf Arrays:

Ein Schlüssel kann entweder eine ganze Zahl oder eine Zeichenfolge sein. Wenn ein Schlüssel die Standarddarstellung einer ganzen Zahl ist, wird er als solcher interpretiert (d. H. "8" wird als 8 interpretiert, während "08" als "08" interpretiert wird). Floats in Schlüssel werden auf Integer abgeschnitten.

Seit self::CAT_CRON_JOBS et al. scheinen, wie sie sollten Konstanten sowieso sein, warum sie nicht einfach definieren, so dass ihr Wert der Beschreibungstext ist, und dann könnte man genauso wie

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

geben Sie Ihre Array Und dann könnte man entweder $CATS_AND_TYPES[self::CAT_STATEMENT_ADMIN] (innerhalb der Klasse verwenden, natürlich) oder $CATS_AND_TYPES['Document Administration'], um das gleiche Array-Element zu bekommen.

+0

danke! und wie für Ihre Idee, habe ich die Konstanten auf Ganzzahlen, die ich in meiner Datenbank als Schlüssel speichern. Ich denke, dass es effizienter ist, nach int-Schlüsseln als nach string zu suchen, und wenn der Name geändert werden muss, hat dies keine Auswirkungen auf die Datenbankdaten. danke für Ihre Hilfe! – Garrett

+0

@Garrett Einverstanden. Ich erkannte nicht, dass die Konstanten den Datenbankwerten entsprachen. In diesem Fall können Sie die Beschreibungen in einem zweiten Array speichern, wie an anderer Stelle erwähnt. –

1

Nein. Arrays können nur Ganzzahlen und Zeichenfolgen als Schlüssel haben.

Sie können Arrays simulieren und Objekte als Schlüssel mit SplObjectStorage verwenden. Keine Arrays.

+1

Oder Ihre eigene Klasse, die 'ArrayAccess' erweitert ... – ircmaxell

1

ich denke, es ist Ihr Problem: P

Ich würde das Problem, wie dieser Ansatz

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

Ich denke, das ist im Grunde, was Sie gemeint „ein weiteres Array machen.“ Dies ist der richtige Ansatz für das Problem, da es die Übersetzung und die hierarchische Information trennt.

Stellen Sie sich vor, wenn Sie Ihr Projekt in eine andere Sprache übersetzen möchten. Wenn Sie einen Übersetzer angestellt haben, sollte er die hierarchische Struktur Ihres Projekts nicht kennen müssen, da er nur übersetzen sollte. Sie können auch $TRANSLATIONS in eine andere Datei extrahieren, so dass Sie diese Datei an 99 Übersetzer verteilen können und Ihr Projekt an einem Tag mehrsprachig ist!

Wenn Sie so geneigt sind, können Sie Ihr Array in einen Skalarwert serialisieren, damit es als Schlüssel dienen kann.

// 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); 
} 
Verwandte Themen