Ergebnis 1 bis 8 von 8

Thema: PHP, Zugriff auf Array-Elemente

  1. #1
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard PHP, Zugriff auf Array-Elemente

    Ich habe hier ein merkwürdiges Problem. Ich habe ein Array mit Objekten darin gegeben. Es ist sichergestellt, dass Count() des Arrays mindestens 1 ist, es ist also nie leer. Wenn ich mir das Array ausgeben lasse per

    PHP-Code:
    echo '<pre>';                
    print_r($this->$AllowedCalendars);
    echo 
    '</pre>'
    dann erhalte ich das:
    Code:
    Array
    (
        [0] => Contao\CalendarModel Object
            (
                [arrData:protected] => Array
                    (
                        [id] => 1
                        [tstamp] => 1546540728
                        [title] => Testkalender                    
                    )
    ... (hier gekürzt)
    Ich möchte nun die "id" des ersten Array-Eintrages bekommen, bzw. die id des einzigen Array-Eintrages, wenn nur ein Eintrag vorhanden ist.

    Normalerweise mache ich das mit
    PHP-Code:
    $NewEventData['pid'] = $this->$AllowedCalendars[0]->id
    Jetzt habe ich hier aber ein (fremdes) Testsystem, auf dem das nicht funktioniert. Der Wert ist einfach "nix".
    Da an anderer Stelle die Auflistung der Array-Einträge funktioniert, habe ich das mal so probiert:
    PHP-Code:
    foreach ($this->$AllowedCalendars as $cal) {                
        
    $NewEventData['pid'] = $cal->id;                    

    Das funktioniert dann auf dem problematischen Testystem. Die Schleife ist da eigentlich relativ sinnfrei, ist mir klar. Gibt an der Codestelle aber nur ein Element im Array.

    Mache ich da mit dem Zugriff auf [0] irgendwas komplett falsch, oder gibt es da eine php/Server/wasweißich-Einstellung, die das mal erlaubt, und mal verhindert?

    Contao-Version ist jeweils 4.4.32, php-Version 5.6.39.
    All of this has happened before - but the question remains: Does all of this have to happen again?

  2. #2
    Contao-Urgestein Avatar von folkfreund
    Registriert seit
    09.04.2010.
    Beiträge
    1.928

    Standard

    Solltest du bei Contao 4.4 nicht sowieso mit PHP 7.x unterwegs sein?
    Ich weiß, das beantwortet nicht direkt deine Frage - aber liegt da vielleicht der Unterschied zwischen den Systemen?

  3. #3
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard

    Nuja, der Code soll ja auch noch für Contao 3.5 laufen, und da ist php 5.6 durchaus noch verbreitet. (Auch wenn die Provider das nach und nach abstellen, bei meinem Hoster ist Januar 2020 Schluss damit).

    Aber der Hinweis ist schon mal gut. In einem Live-System unter Contao 3.5 mit PHP 5.6 kann ich den Fehler jetzt endlich auch bei mir reproduzieren. Scheint also wirklich an der PHP-Version zu liegen.

    Bin aber kein PHP-Experte, und bin daher etwas ratlos, wie ich das (sinnvoll) unter der alten Version zum Laufen bringe. Das Ding mit der Schleife erscheint mir doch etwas unschön.
    All of this has happened before - but the question remains: Does all of this have to happen again?

  4. #4
    Contao-Urgestein Avatar von folkfreund
    Registriert seit
    09.04.2010.
    Beiträge
    1.928

    Standard

    Zumindest habe ich mal das hier gefunden:
    http://php.net/manual/en/migration70.incompatible.php

    Da scheint es etliche Änderungen in Bezug auf Arrays zu geben. Ich bin leider auch kein PHP-Programmierer. Mal sehen, ob wir da noch mehr finden...

  5. #5
    Contao-Urgestein Avatar von folkfreund
    Registriert seit
    09.04.2010.
    Beiträge
    1.928

    Standard

    Versuch mal folgendes:

    PHP-Code:
    $ids array_columns($this->AllowedCalendars'id');
    $NewEventData['pid'] = $ids[0]; 
    oder

    PHP-Code:
    $first reset($this->AllowedCalendars);
    $NewEventData['pid'] = $first->id
    oder

    PHP-Code:
    $first reset($this->AllowedCalendars);
    $NewEventData['pid'] = $first['id']; 
    Edit: Geändert nach Spooky's Hinweis.
    Geändert von folkfreund (04.01.2019 um 18:49 Uhr)

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.063
    Partner-ID
    10107

    Standard

    Sollte es nicht
    PHP-Code:
    $this->AllowedCalendars 
    sein..?

  7. #7
    Contao-Urgestein Avatar von folkfreund
    Registriert seit
    09.04.2010.
    Beiträge
    1.928

    Standard

    Ja, bestimmt

    Ich hatte es einfach oben bei Gausi abgeschrieben. Komisch, dass da bei ihm was funktioniert hat...
    Geändert von folkfreund (04.01.2019 um 18:48 Uhr)

  8. #8
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard

    Zitat Zitat von folkfreund Beitrag anzeigen
    Komisch, dass da bei ihm was funktioniert hat...
    Jetzt wo du (bzw. ihr beide) das sagst... wundert mich das auch etwas.

    Tatsache ist, dass das mit dem $ funktioniert unter PHP7. Hab ich in dem Code konsequent so benutzt.

    Ich verwende jetzt überall
    PHP-Code:
    $this->AllowedCalendars 
    , und das scheint zu klappen. So ist das ja eigentlich auch syntaktisch richtig.

    Ich versuche jetzt nicht zu verstehen, was da genau bei Verwendung von
    PHP-Code:
    $this->$AllowedCalendars 
    (also indirekte Variablen, wie ich grade gelernt habe) da intern abläuft. In dem Link von folkfreund ist ja (unter anderem) erläutert, das sich bei der Interpretation von solchen Konstrukten wie
    PHP-Code:
    $foo->$bar['baz'
    zwischen 5.6 und 7 was geändert hat. Also, Frage geklärt, und am Ende war es ein peinlicher Anfänger-Fehler. Vielen Dank!

    (Jetzt brauch ich ne Pause.)
    All of this has happened before - but the question remains: Does all of this have to happen again?

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •