2016-07-13 5 views
1

Ich habe ein Problem mit der Usort-Funktion. Mein Array hat folgendes Modell:PHP: Objekt der Klasse Closure konnte nicht in int konvertiert werden

Fusion 
| 
| Array_1 
| | 
| | Array_1_1 
| | | clock => "08:08" 
| | | //Other fields 
| | | 
| | 
| | Array_1_2 
| | | clock => "04:51" 
| | | //Other fields 
| | | 
| 
| Array_2 
| ... 

Ich möchte die Arrays in Matrix_X Stationierung sortieren auf das Feld ‚Uhr‘. Ich habe diesen Code auf der PHP-Dokumentation von usort (4. Beispiel) stützen:

foreach ($fusion as $fus){ 
    usort($fus,function ($key = 'clock'){ 
     return function ($a,$b) use ($key){ 
      return strnatcmp($a[$key],$b[$key]); 
     }; 
    }); 
} 

... aber es gibt die folgende Ausnahme:

Object of class Closure could not be converted to int 

Haben Sie eine Idee? Danke für Ihre Hilfe.

+0

gefunden, was Sie mit diesem 'function ($ key = 'Uhr')' ... versuchen zu tun? – deceze

Antwort

2

Sie versuchen, die folgenden als Callback (2. Argument von usort)

function ($key = 'clock'){ 
     return function ($a,$b) use ($key){ 
      return strnatcmp($a[$key],$b[$key]); 
     }; 
} 

Aber die Dokumentation gibt an klar, dass muss

Die Vergleichsfunktion für eine ganze Zahl passieren [zurückkehren .. .]

Ihr Callback gibt jedoch einen anderen Abschluss zurück. Aus diesem Grund erhalten Sie eine Closure to int conversion-Ausnahme.

Ich glaube, was Sie versuchen, ist die innere Schließung ausführen, um den endgültigen Rückruf mit den richtigen Werten zu erhalten. Ich würde sagen, dass dies nutzlos ist, da php closures, im Gegensatz zu Javascript, Opt-in, nicht all-in, was bedeutet, dass ihr Kontext mit use enthalten sein muss, wie Sie für $key in der äußeren Schließung getan haben.

Sie könnten einfach tun:

$key = 'clock'; 
foreach ($fusion as $fus){ 
    usort($fus,function ($a,$b) use ($key){ 
      return strnatcmp($a[$key],$b[$key]); 
    }); 
} 

Und wenn $key von einer anderen Art von Kontext kommt können Sie nur die variable Zuordnung anpassen.

+0

Keine Ausnahme mehr, aber die Sortierung funktioniert nicht. Ich werde versuchen, herauszufinden, warum. – morandmr

+0

Sie meinen, die Ergebnisse sind nicht das, was Sie erwarten? Sehen Sie Änderungen in der Reihenfolge des Arrays? Hast du bestätigt, dass "strnatcmp" so funktioniert, wie du es manchmal erwartest? – Sebas

+0

Sie haben Recht, strnatcmp hat nicht zurückgegeben, was ich erwartet habe. Jetzt konvertiere ich meine Zeichenketten in DateFormat, es gibt die richtigen Ergebnisse zurück, aber es ändert sich nichts an meinem Array. Hier ist mein Code: 'foreach ($ Fusion als $ fus) { usort ($ fus, Funktion ($ a, $ b) verwenden ($ Schlüssel) { $ date1 = Datum_create_from_format ('H: i', $ a [$ key]); $ date2 = date_create_from_format ('H: i', $ b [$ key]); zurück ($ date1> $ date2)? - 1: 1; }); } ' z.: 20:51> 01:02? res = Ja 08:53> 20:51? res = Nein EDIT: Wie kann ich Zeilenumbrüche setzen? – morandmr

-2

Konvertieren Sie Ihr Objekt zuerst in ein Array mit get_object_vars($object).

Wenn das Objekt, das Sie erhalten, von einer anderen Funktion generiert wird, lesen Sie die Dokumentation für diese Funktion und finden Sie einen Weg, ein Array anstelle eines Objekts zurückzugeben.

Beispiele und Dokumentation finden Sie hier http://php.net/manual/en/function.get-object-vars.php

Verwandte Themen