2016-09-20 1 views
2

Die PHP Funktion array_map(...) erwartet einen Rückruf als erster Parameter (oder null für creating an array of arrays) und eine variable Anzahl von Array-Argumenten, zB:Wie benutzt man ein Array von Arrays mit array_map (...) in PHP?

$foo => array_map(null, $bar, $buz); 

Jetzt habe ich einen Fall, wo ich array_map(...) eine Variable übergeben muß Anzahl der Arrays. Ich kann das nicht hart codieren, da die Arrays für den Eingang array_map(...) dynamisch generiert werden.

function performSomeLogicAndGetArgumentsForMyFunction() { 
    ... 
    return ['bar' => [...], 'buz' => [...]]; 
} 
$foo = array_map(null, performSomeLogicAndGetArgumentsForMyFunction()); 

Es muss nicht auf diese Weise funktionieren, da array_map(...)eine variable Anzahl von Arrays erwartet und nicht ein Array von Arrays.

Gibt es dafür eine Lösung? Wie kann ich den Anruf flexibel halten und eine variable Anzahl von Argumenten an die array_map(...) übergeben? (Dies gilt auch für jede andere variadische Funktion, die ich nicht manipulieren kann.)

+1

Werfen Sie einen Blick auf 'call_user_func_array()' – Rizier123

+0

Danke Jungs! Ja, sicher, es ist nur ein Array und kann leicht entpackt/iteriert werden. – automatix

+0

Sorry, ich habe die Frage falsch formuliert. Das Problem besteht tatsächlich darin, die Argumente, z. zu der 'array_map (...)'. Ich habe gerade die Frage bearbeitet. – automatix

Antwort

-2

Als letztes Mittel verwenden eval

//build you array of array variable names with the dynamic content coming in. 
$arrays = ['$foo', '$bar', '$baz']; 

$str = implode(', ', $arrays); 
eval("\$map = array_map(null, $str);"); 

print_r($map); 

Vorsicht nie un-hygienisiert Eingang eval zu senden.

See it working

+0

Dies ist funktionierender Code, der getestet wurde und der die Frage beantwortet, ob eine variable Anzahl unbekannter Arrays an die Funktion array_map übergeben werden kann. Wenn du unten abstimmst, hinterlasse einen Kommentar, der erklärt warum. – dlporter98

0

Sie Rückkehr ein Array von Arrays, und Sie wollen über die innerste dieser Arrays abzubilden. Sie können argument unpacking für diesen Einsatz:

function say($n, $m) { 
    return "The number $n is called $m in Spanish"; 
} 
function arrays() { 
    return [ 
     [ 1, 2, 3 ], 
     [ 'uno', 'dos', 'tres' ], 
    ]; 
} 
print_r(
    array_map('say', ...arrays()) 
); 

See it online at 3v4l.org.

Alternativ können Sie call_user_func_array verwenden, wie in der RFC zu einem messbaren Laufzeitkosten erwähnt:

print_r(
    call_user_func_array(
     'array_map', 
     array_merge(array ('say'), arrays()) 
    ) 
); 

See it online at 3v4l.org.

Jedes dieser Muster kann variante Formen gebräuchlicher Methoden implementieren. Zum Beispiel kann zu emulieren vsprintf man verwenden:

sprintf('%s %s', ...['Hello', 'World']); 
call_user_func_array('sprintf', array_merge(['%s, %s'], ['Hello', 'World']));