2016-06-09 19 views
0

ich eine Frage habe So habe ich dieses Array:rekursive ksort: nicht sortieren das Array

Array 
(
[2016] => Array 
    (
     [23] => Array 
      (
       [total_auctions] => 0 
       [total_price] => 0 
      ) 

     [22] => Array 
      (
       [total_auctions] => 0 
       [total_price] => 0 
      ) 

     [21] => Array 
      (
       [total_auctions] => 0 
       [total_price] => 0 
      ) 

     [20] => Array 
      (
       [total_auctions] => 0 
       [total_price] => 0 
      ) 
) 

I durch Schlüssel rekursive sortieren möchten. So schaffe ich die Methode:

public function sortNestedArrayAssoc($a) 
{ 
    if (!is_array($a)) { 
     return false; 
    } 
    ksort($a); 
    foreach ($a as $k=>$v) { 
     $this->sortNestedArrayAssoc($a[$k]); 
    } 
    return true; 
} 

Aber ich bekomme das gleiche Ergebnis, das Array mit dem Schlüssel 23 ist das erste und I don‘wirklich verstehen, wo das Problem ist. Kannst du mir bitte helfen ? Thx im Voraus und Entschuldigung für mein Englisch

+3

Sie benötigen die Methode arg, die als Referenz übergeben werden soll. –

Antwort

4

Als John Stirling erwähnt, etwas, was Sie tun könnten, wäre Ihre arguments by reference übergeben. Sie können dies tun, indem Sie den &-Operator in Ihrem Methodenargument verwenden. Die Syntax für das wäre (mit nur der ersten Zeile zu sein ändern):

public function sortNestedArrayAssoc(&$a) 
{ 
    if (!is_array($a)) { 
     return false; 
    } 
    ksort($a); 
    foreach ($a as $k=>$v) { 
     $this->sortNestedArrayAssoc($a[$k]); 
    } 
    return true; 
} 

Dies bedeutet, dass Sie dann die Variable in Ihrer Funktion sind vorbei und es direkt, anstatt zu modifizieren, was PHP ist normalerweise das ist ein Pass Kopie der Variable in Ihre Funktion. ksort ist ein Beispiel für eine Funktion, die in ihrer Funktionsdefinition eine Übergabe als Referenz verwendet.

Wenn Sie sich strikt dagegen aussprachen, per Verweis zu verweisen, müssten Sie Ihren Code ändern, um Ihre Variable/Ihr Array an den aufrufenden Bereich zurückzugeben, in dem Sie dann Ihr Array aktualisieren.

public function sortNestedArrayAssoc($a) 
{ 
    if (is_array($a)) { 
     ksort($a); 
     foreach ($a as $k=>$v) { 
      $a[$k] = $this->sortNestedArrayAssoc($v); 
     } 
    } 
    return $a; 
} 
+0

Was wäre der Vorteil, wenn es als Referenz statt als Wert übergeben wird? – SML

+0

Vorzug zum größten Teil. Sie sparen bei der Speicherauslastung, indem Sie den Pass-by-Reference verwenden (da PHP keine Kopie Ihrer Variablen erstellen muss, wird sie nur an Ort und Stelle geändert). – MasterOdin

+0

danke für deine antwort. Es scheint, dass Pass-by-Referenz langsamer in der Leistung ist, so dass ich gerade nicht sicher war, wann ich es verwenden sollte. http://stackoverflow.com/questions/178328/in-php-5-0-is-passing-by-reference-faster – SML