2017-08-16 2 views
0

I eine Funktion haben, die sich auf ein Array zurück (globals werden der Einfachheit halber verwendet, tatsächlich diese Arrays sind Elemente einiger großer Baumstruktur):PHP append Array zu Array-Referenz

$array1; 
$array2; 

function &foo($arg){ 
    //deduce from $arg reference to which array should be returned 
    if(...) { 
    global $array1; 
    return $array1; 
    } else { 
    global $array2; 
    return $array2; 
    } 
} 

Dann muss ich append eine andere Anordnung zu der mit dieser Funktion zurück (so dass die anfängliche Array geändert wurde):

$arrayToAppend = array('a','b'); 
$arrayToChange = &foo($arg); 
$arrayToChange = array_merge($arrayToChange, $arrayToAppend); 

Ist es richtige Syntax für das, was ich tun will? Ändert es das referenzierte Array? Gibt es irgendwelche Fallstricke, die ich wissen sollte? (Fallstricke über Nachschlagewerke, nicht über Verschmelzen von assoziativen Arrays usw.)

Antwort

0

Sie vermischen Dinge. Sie sollten nur & vor einem Parameter in Ihrer Funktion verwenden (wenn der Parameter ein einfacher Typ ist, also kein Objekt) und Sie möchten, dass sich der Inhalt dieses Parameters ändert.

Beispiel:

<?php 

$arrayToChange = array('a', 'b'); 
$arrayToAppend = array('c', 'd'); 
mergeArrays($arrayToChange, $arrayToAppend); 

// $arrayToChange will now contain 'a', 'b', 'c', 'd' 

function mergeArrays(& $array, $arrayToAppend) 
{ 
    $array = array_merge($array, $arrayToAppend); 
} 

//Note: This is not the way you should do it. 
//A function best returns a result. 
//This just illustrates how you can change the content of a parameter 
+0

Ich möchte keinen Parameter innerhalb Funktion ändern. Funktion ist nur verantwortlich für "Auswahl" Array und Rückkehr Verweis darauf. –

+0

Ich verstehe jetzt, was Sie wollen. Basierend auf einer Bedingung, die Sie die Referenz (Zeiger) von der Funktion zurückgegeben werden soll. Ich denke, was Sie tun, ist richtig. Ich bezweifle Sie gewinnen Sie viel, indem Sie nur die Referenz zurückgeben.Sie könnten einfach das Array zurückgeben, was die meiste Zeit erledigt ist.Sie ​​sorgen sich um Speicherverbrauch oder Geschwindigkeit? – RWC

+0

Nein, die Sache ist, dass ich das tatsächliche Array ändern muss, das ein Teil des großen Baumes ist Struktur von solchen Arrays Die Funktion 'foo ($ arg)' ist eine Finder-Funktion (welches Array zu ändern ist), die für viele mögliche sich ändernde Operationen wiederverwendet wird. –