mark: PHP: Teile von einem Array ersetzen

Schönen Sonntag,

ich habe folgendes Array genannt $video_arr:

Array
(
    [videos] => Array
        (
            [video] => Array
                (
                    [0] => Array
                        (
                            [title] => Mein titel
                            [lnk] => shortcutlnk
                            [platform] => youtube
                            [dl] => Array
                            [desc] => Beschreibung
                            [date] => 2012-04-25
                        )

usw ...

Ich möchte nun das Datumsformat und den Link eines jeden Videos ändern, bevor ich die Daten weiterreiche. Dazu habe ich eine foreach-Schleife gewählt:

 foreach( $video_arr['videos']['video'] as $key => $video ){  
        if( $video['platform'] == 'youtube' ){  
            $video_arr['videos']['video'][$key]['lnk'] = 'http://www.youtube.com/watch?v='.$video['lnk']; // get full video link  
        }  
  
        // change date format  
        $date = new DateTime($video['date']);  
        $video_arr['videos']['video'][$key]['date'] = $date->format('d.m.Y');  
    }

Die Lösung klappt zwar, aber irgendwie finde ich sie unschön programmiert. Vor allem stört mich dabei das endlos lange $video_arr['videos']['video'][$key]['date'].

Geht das gut so, oder kriegt man das von der Syntax her schöner hin?

lg
mark

  1. Tach!

    Die Lösung klappt zwar, aber irgendwie finde ich sie unschön programmiert. Vor allem stört mich dabei das endlos lange $video_arr['videos']['video'][$key]['date'].
    Geht das gut so, oder kriegt man das von der Syntax her schöner hin?

    Es gibt keine einfachere Art, Zugriffe auf Arrays zu notieren. Wenn dir die Länge nicht zusagt, kannst du es nur insgesamt noch länger machen und die Einzelschritte in einzelnen Variablen ablegen.

    dedlfix.

  2. Lieber mark,

    was hälst Du davon?

    $v_arr = &$video_arr['videos']['video'];  
      
    foreach ($v_arr as $key => $video) {  
        if ($video['platform'] == 'youtube') {  
            // get full video link  
            $v_arr[$key]['lnk'] = 'http://www.youtube.com/watch?v='.$video['lnk'];  
        }  
      
        // change date format  
        $v_arr[$key]['date'] = date('d.m.Y');  
    }
    

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Tach!

      was hälst Du davon?

      Willst du ihm etwas aufhalsen? Hältst du das für notwendig? :-)

      $v_arr = &$video_arr['videos']['video'];

      Aber danke, für das indirekte draufhinweisen. Ich hab (mal wieder) nicht genau hingesehen. Man kann da in dem Fall natürlich was abkürzen, aber so würde ich das nicht machen, sondern foreachs Referenzmöglichkeit nutzen.

      foreach ($video_arr['videos']['video'] as $key => &$video) {

      Damit kann er nun auch den Inhalt von $video ändern, was durch die Referenz das eigentliche Array ändert.

      Allerdings muss man noch anmerken, dass die Referenz am Ende des foreach nicht von selbst wieder entfernt wird. Verwendet man nun die Variable $video für andere Zwecke, dann ist das immer noch ein Verweis auf das letzte foreach'te Element, und eine Zuweisung ändert dieses. Man sollte bei foreach-Schleifen mit Referenz nachher die Laufvariable mit unset() "befreien", hier also: unset($video).

      dedlfix.

    2. was hälst Du davon?

      Spitze!

      foreach ($video_arr['videos']['video'] as $key => &$video) {

      Danke Felix, danke dedlfix,

      das isses. Ich hab mich schon gefragt, ob man da nicht eine Art "Pointer" setzen kann. Wobei Pointer laut PHP-Referenz ja nicht ganz der richtige Ausdruck ist, dort ist von "Referenzen" die Rede.

      Kann mir bitte zum Abschluss und zum besseren Verständnis, jemand den Unterschied erklären?

      Für mich ist "Pointer" und "Referenz" das selbe. Zumindest in PHP, da gibt es ja keine Pointer, oder? Diesen Unterschied gibt's nur z.B. bei C/C++, aber nicht in PHP?

      Danke abermals

      mark

      1. Tach!

        Kann mir bitte zum Abschluss und zum besseren Verständnis, jemand den Unterschied erklären?
        Für mich ist "Pointer" und "Referenz" das selbe.

        Vom Prinzip her ja, beide verweisen auf etwas. Eine Referenz zeigt auf eine Variable, ein Pointer zeigt auf eine Speicheradresse. Ein Pointer, so er nicht typisiert ist, kann auf alles mögliche zeigen, auch Code.

        Zumindest in PHP, da gibt es ja keine Pointer, oder? Diesen Unterschied gibt's nur z.B. bei C/C++, aber nicht in PHP?

        Da dich PHP nicht direkt an den Speicher ranlässt, brauchst du auch keine Verweise auf Speicheradressen.

        dedlfix.