johny7: Aktion auf jedes Element eines Arrays ausführen

Moin allerseits,

ich suche gerade nach einer Funktion, mit der man bestimmte Befehle auf jedes Element eines Array ausführen kann. Z.B. will ich alle Elemente mit utf8_decode() dekodieren oder wieder kodieren. Da will ich nicht für jede Funktion ein Komplement für Arrays schreiben. Gibt es das schon? Oder könnte man so eine Funktion schreiben, die dann z.B. so aufgerufen werden kann:

  
$array1 = new array();  
etc.  
  
$array2 = aktionAufArray($array1,'utf8_encode');  

Grüße, JN

--
ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
http://www.johny7.de
  1. Hi,

    ich suche gerade nach einer Funktion, mit der man bestimmte Befehle auf jedes Element eines Array ausführen kann.

    Wenn du wirklich suchen würdest, solltest du auch fündig werden können: http://www.php.net/manual/en/ref.array.php

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Moin allerseits,

      Hi,

      ich suche gerade nach einer Funktion, mit der man bestimmte Befehle auf jedes Element eines Array ausführen kann.

      Wenn du wirklich suchen würdest, solltest du auch fündig werden können: http://www.php.net/manual/en/ref.array.php

      Da hatte ich schon einen flüchtigen Blick hineingeworfen. Jetzt hab ich's: array_map()

      Grüße, JN

      --
      ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
      http://www.johny7.de
      1. Moin allerseits,

        ich habe jetzt eine Funktion programmiert, mit der man mehrere Arrays auf einmal durch eine callback-Funktion laufen lassen kann. Allerdings kann man an die callback-Funktion keine Parameter übergeben.

        In einem konkreten Anwendungsfall würde das so aussehen:

          
        $mirona = array();  
        $mirona['gmbh'] = "mirona GmbH";  
        $mirona['street'] = "Leichenweg 1a";  
        $mirona['plz'] = "12345";  
        $mirona['ort'] = "Berlin";  
          
        $client = array();  
        $client['firma'] = "Mein Würstchenbud KG";  
        $client['person'] = "Max Mustermann";  
        $client['street'] = "Lebendengasse 50";  
        $client['plz'] = "42123";  
        $client['ort'] = "Andersbrück";  
        $client['no'] = "F73N39HOMN0";  
          
        $rechnung = array();  
        $rechnung['title'] = "Ihre Weinbestellung";  
        $rechnung['no'] = "107748";  
          
        array_map_m('utf8_decode','mirona','client','rechnung');  
          
        
        

        Die Funktion sieht so aus:

          
        function array_map_m($callback)  
        {  
        	$error1 = utf8_decode('Übergeben Sie der Funktion <strong>array_map_m()</strong> eine callback-Funktion und mindestens ein Array (nur den Namen als string) als Parameter.');  
        	$error2 = utf8_decode('Die Funktion <strong>array_map_m()</strong> erwartet ab dem zweiten Parameter strings mit den Namen von globalen Arrays.');  
        	if (func_num_args() < 2)  
        	{  
        		trigger_error($error1,E_USER_ERROR);  
        	}  
        	$args = func_get_args();  
        	foreach ($args as $key => $arrayname)  
        	{  
        		if ($key == 0) continue 1;  
        		eval('global $'.$arrayname.';');  
        		eval('$array = $'.$arrayname.';');  
        		if (!is_array($array)) trigger_error($error2,E_USER_ERROR);  
        		eval ('$'.$arrayname.' = array_map("'.$callback.'",$'.$arrayname.');');  
        	}  
        }  
        
        

        Kann man diesen Code noch optimieren? Insbesondere fände ich es schön, wenn man die Arrays normal und nicht als String übergeben könnte.

        Grüße, JN

        --
        ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
        http://www.johny7.de
        1. Hi!

          ich habe jetzt eine Funktion programmiert, mit der man mehrere Arrays auf einmal durch eine callback-Funktion laufen lassen kann. Allerdings kann man an die callback-Funktion keine Parameter übergeben.

          Da hätte ich vermutlich array_walk_recursive() verwendet. Die zu durchlaufenden Arrays kommen in ein temporäres Array und Benutzerdaten kann man auch noch durchreichen.

          Kann man diesen Code noch optimieren? Insbesondere fände ich es schön, wenn man die Arrays normal und nicht als String übergeben könnte.

          Es gibt die Function Handling Functions. Mit denen kann man sich den Aufruf von Funktionen und deren Parametern zur Laufzeit zusammenbauen und braucht dazu kein eval(). Probier man die oben genannte Funktion, damit löst sich das eval-Problem auch auf.

          Warum glaubst du eigentlich eine potentiell verlustbehaftete Zeichenumkodierung verwenden zu müssen? Was ist dein eigentliches Problem?

          Lo!