2017-08-09 8 views
0

Ich versuche, Arrays zu kreuzen, um automatisch Daten für verschiedene Testszenarien in einer App zu erstellen. Hier sind die Arrays sein Kreuz verbunden (man beachte, dass $base['sales'] hat einige Elemente hatte aus ihm abgezogen, es zu vereinfachen für die Entsendung dieser Frage):Cross-Join-Arrays zum Generieren von Daten für Testszenarien

$base['sales'] = ['shirts'=>1200.0, 'pants'=>1000.0, 'socks'=>1700.0]; 

$scenarioIDs = range(1, 5); 

Das Endergebnis soll wie folgt aussehen:

$data[1]['sales'] = ['shirts'=>1200.0, 'pants'=>1000.0, 'socks'=>1700.0]; 
$data[2]['sales'] = ['shirts'=>1200.0, 'pants'=>1000.0, 'socks'=>1700.0]; 
$data[3]['sales'] = ['shirts'=>1200.0, 'pants'=>1000.0, 'socks'=>1700.0]; 
$data[4]['sales'] = ['shirts'=>1200.0, 'pants'=>1000.0, 'socks'=>1700.0]; 
$data[5]['sales'] = ['shirts'=>1200.0, 'pants'=>1000.0, 'socks'=>1700.0]; 

ich habe dies versucht:

$data = []; 
    array_map(function($scenarioID) { 
     $data[$scenarioID]['sales'] = $base['sales']; 
    }, $scenarioIDs); 
echo '<pre>' . print_r($data, 1) . '</pre>';  
exit(); 

aber die Botschaft Undefined variable: base in C:\xampp\htdocs\Sales\index.php on line 72 fünfmal (eine für jede scenarioID) erhalten.

Ich denke, es muss einen Weg geben, dies zu tun, ohne Schleifen zu verwenden. Wer weiß, wie?

+0

'function ($ scenarioIDs) verwenden ($ base) {...' –

+0

Mögliche Duplikat von [ PHP-Variablen in anonymen Funktionen] (https://stackoverflow.com/questions/11420520/php-variables-in-anonymous-functions) –

Antwort

1

Um eine Variable von außen Kontext in Ihrer anonymen Funktion zu nutzen, müssen Sie das use Stichwort:

array_map(
    function($id) use ($base, &$data) {/* fill out the function */}, 
    $scenarioIDs 
); 

Diese Syntax die Funktion eine Kopie von $base zu der Zeit wird zuerst aufgerufen machen wird, also wenn Sie Nehmen Sie Änderungen an $base vor, und versuchen Sie, denselben benutzerdefinierten Zuordner zu verwenden, werden die neuen Werte von $base nicht wiedergegeben. Also, wenn Sie die anonyme Funktion müssen immer mit dem aktuellen Wert von $base zu arbeiten, passieren dann dieses Argument durch Verweis als ich mit $data tat:

function($id) use (&$base, &$data) {} 

From the docs:

Verschlüsse auch Variablen erben können aus der übergeordnete Bereich Solche Variablen müssen an das Sprachkonstrukt übergeben werden.

Als Nebenbemerkung ist array_map soll die zugeführte Array ($scenarioIDs in diesem Fall) in eine andere Anordnung zu transformieren. Du benutzt es nicht wirklich so, wie es gemeint war. Wenn alles, was Sie tun möchten, die Szenario-IDs als Schlüssel zum $data ist zu befestigen, benutzen Sie einfach diesen Einzeiler:

foreach($scenarioIDs as $id) $data[$id]['sales'] = $base['sales']; 
Verwandte Themen