Sortieren eines array aus SimpleXML-Objekten
Habe ich gelesen, was ich gefunden habe, auf Stackoverflow und bin immer noch unklar, auf dieser.
Ich habe ein array aus SimpleXML-Objekten, so etwas wie dieses:
array(2) {
[0]=>
object(SimpleXMLElement)#2 (2) {
["name"]=>
string(15) "Andrew"
["age"]=>
string(2) "21"
}
[1]=>
object(SimpleXMLElement)#3 (2) {
["name"]=>
string(12) "Beth"
["age"]=>
string(2) "56"
}
}
Und ich möchte in der Lage sein, zu Sortieren: was auch immer Spalte, aufsteigend oder absteigend. So etwas wie:
sort($data, 'name', 'asc');
Wo ich kann in der obigen array von Objekten Sortieren nach dem Wert, welcher Taste, die ich mag.
Referenz, eine ähnliche .NET-Lösung wäre entlang dieser Linien:
XmlSortOrder order = XmlSortOrder.Ascending;
if ( sortDirection == "asc" ) {
order = XmlSortOrder.Ascending;
}
expression.AddSort( columnSortingOn + "/text()", order,
XmlCaseOrder.UpperFirst, "en-us", XmlDataType.Text );
Ich habe Leute gesehen, die sagen
"Verwenden usort"
Gefolgt von einem einfachen Beispiel aus dem PHP-manual, sondern das nicht wirklich erklären. Zumindest nicht für mich. Ich habe auch gesehen, wie Leute empfehlen die Verwendung einer externen Bibliothek, wie SimpleDOM aber ich möchte vermeiden, mit etwas externes für diese (scheinbar, obwohl ich noch nicht lösen) kleines Ding.
Jede Hilfe ist willkommen, Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, die Leute, die darauf hindeutet verwenden SimpleDOM mich sein würde. 🙂
Habe ich geschrieben SimpleDOM::sort() genau für diese situation, weil in Reihenfolge zu Sortieren SimpleXMLElements durch ein Schiedsgericht Ausdruck (oder beliebige Ausdrücke), die Sie verwenden müssen
array_multisort()
das ist langweilig und kann nicht lehren, etwas nützliches.Hier ist die kurze version, wie es funktioniert: zunächst erstellen Sie einen proxy-array mit key=>Wert-Paaren, die der jeweiligen SimpleXMLElement und der Wert, mit dem Sie sortiert werden. In deinem Beispiel, wenn Sie wollen, um Sie zu Sortieren durch
<age/>
, das array wärearray(21, 56)
. Dann rufen Siearray_multisort()
mit der "proxy-array als erstes argument, gefolgt von einer beliebigen Anzahl von Sortierung Modifikatoren wie SORT_DESC oder SORT_NUMERIC dann endlich das array, das Sie wollen, um zu Sortieren, die per Referenz übergeben werden.Werden Sie am Ende mit etwas wie dieses:
Aber wirklich, statt belasten sich mit mehr code, den Sie haben, zu erhalten und möglicherweise zu enden umschreiben
array_multisort()
im userspace, sollten Sie bereits vorhandene Lösungen. Es gibt nichts Interessantes in so ein Sortier-Algorithmus/routine, Ihre Zeit wäre besser ausgegeben für etwas, das nicht bereits vorhanden ist.Den
usort
- Funktion ermöglicht es Ihnen erzählen PHPEr hat nichts speziell zu tun mit SimpleXML. Es ist eine generische Funktion für die Sortierung PHP built-in-array-Daten-Sammlung.
Müssen Sie eine Funktion schreiben, Instanzmethode oder statische Methode zum Sortieren von Arrays. Das zweite argument von usort akzeptiert eine PHP Callback, das ist ein pseudo-Typ, können Sie angeben, welche Funktion Instanzmethode oder eine statische Methode.
Die Funktion, die Sie schreiben, wird akzeptiert zwei Argumente. Diese werden zwei verschiedene Werte aus dem array
Den Sie schreiben müssen, diese Funktion geben Sie einen der drei Werte.
Beim Aufruf usort, PHP durch array, indem Sie mit Ihrer Sortier-Funktion/- Methode (in diesem Fall
cmp
immer und immer wieder, bis das array sortiert ist. In deinem Beispiel $a und $b werden SimpleXML-Objekte.Ich war bereit zu empfehlen
usort()
bis ich merkte Sie schon, mich zu schlagen. Da die code-Beispiele haben nicht viel gutes getan in der Vergangenheit, werde ich versuchen Sie einfach zu erklären, es in einfachem Englisch, und hoffentlich, dass bekommst du schon in die richtige Richtung.Mithilfe
usort()
erstellen Sie Ihre eigenen user-generated - "Algorithmus". Dieusort()
Funktionsaufrufe, die Ihre eigenen Vergleich-Funktion, um zu bestimmen, wie die einzelnen Objekte bezieht sich auf eine andere. Wenn das schreiben der Vergleich-Funktion, bekommen Sie bestanden in zwei Objekte in das array. Mit diesen beiden Objekten, kehren Sie zu einem Ergebnis, das im wesentlichen erzähltusort()
ob das erste Objekt istLESS THAN
,EQUAL TO
oderGREATER THAN
das zweite Objekt. Sie tun dies durch Rückgabe von -1, 0 oder 1 (bzw.). Das ist es. Sie müssen nur sich selbst zu, wie zwei Objekte miteinander vergleichen und die tatsächliche Sortierung mechanik behandeltusort()
für Sie.Ok, jetzt für eine semi-Beispiel aus der Praxis:
Dies ist so ziemlich das Beispiel im PHP-Handbuch, aber ich hoffe, es macht Sinn im Kontext jetzt. Lassen Sie mich wissen, wenn ich mich nicht klar auf etwas.
usort()
diese Weise, obwohl, so kann ich nicht Versprechen, es wird funktionieren. Ich würde einen kurzen test, wenn ich mehr Zeit hätte.Hier ist ein weiteres Beispiel für die Verwendung
usort()
. Dieses erlaubt Ihnen die Angabe der Objekt-Variablen und der Art Richtung:Test-code;
es ist ein Alter thread, aber hier ist meine Lösung, dass eine Verwendung zum extrahieren von Informationen aus einem rss-feed, um auf Sortieren nach Titel