array_multisort mit Objekte anstatt Array ?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
artikel
aufruf
ausgabe
blume
chemie
code
datensatz
datum
dosenbier
element
funktion
info
objekt
sortieren
sortierung
string
struktur
umwandeln
url
-
Hallo
(wie) funktioniert multisort auch für Objekte (als Daten)
geht das, oder muss ich die Objekte immer zuerst in Array umwandeln ?
mit Array ist es ja kein Problem:
Array ( [Artikel] => Array ( [0] => Array ( [id] => 1 [title] => Chemie [info] => xxx ... ) [1] => Array ( [id] => 2 [title] => Abend [info] => xxx ... ) [2] => Array ( [id] => 3 [title] => Dosenbier [info] => xxx ... ) [3] => Array ( [id] => 4 [title] => Blumen [info] => xxx ... ) ) )
BSP: Sortierung nach ['title'] aufsteigend
$daten_array = $data['Artikel']; foreach ($daten_array as $key => $row) { $sortby[$key] = $row['title']; } array_multisort($sortby, SORT_ASC, $daten_array);
wie aber, wenn ich anstatt $daten_array die Daten als Objekte vorliegen habe ?!?
(z.B. nach simplexml_load_file o.ä.)
$daten_object
SimpleXMLElement Object ( [Artikel] => Array ( [0] => SimpleXMLElement Object ( [id] => 1 [title] => Chemie [info] => xxx ... ) [1] => SimpleXMLElement Object ( [id] => 2 [title] => Abend [info] => xxx ... ) [2] => SimpleXMLElement Object ( [id] => 3 [title] => Dosenbier [info] => xxx ... ) [3] => SimpleXMLElement Object ( [id] => 4 [title] => Blumen [info] => xxx ... ) ) )
Wenn ich es direkt mit Objekt-Daten versuche, dann erhalte ich die Meldung
Warning: array_multisort() ... Argument #3 is expected to be an array
gibt es sowas wie object_multisort (analog zu array_multisort) oder andere Methode
... oder muss ich immer zuerst die Objekte zu Array umschreiben / umspeichern ?!
$data = simplexml_load_file($xml_source); $daten_object = $data->Artikel; function object2array($object) { if (is_object($object)) { $object = get_object_vars($object); if (empty($object)) { $object = ''; } } return is_array($object) ? array_map(__FUNCTION__, $object) : $object; } $daten_array = object2array($daten_object);
das wäre aber bei größeren Daten-Mengen auch entsprechend Ressourcen-fressend
wenn jedesmal die Umwandlung von Objekt zu Array notwendig wäre ...
Wie kann man direkt die Objekt-Daten sortieren (so wie bei array_multisort)
geht das überhaupt "direkt" mit Objekte oder gundsätzlich nur mit Arrays ?!
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
livesuche schrieb:
das ist zwar ein etwas älteres dok., aber ich glaube könnte auch heute noch funktionieren:
... oder muss ich die Objekte immer zuerst in Array umwandeln ? ...
simplexml_load_file sortieren -
ja, Danke
mit XSL kann man zwar die Ausgabe (Anzeige) sortieren,
aber ich hätte gern die "Daten" sortiert
für z.B.Ausgabe 10 von 100 Artikel pro Seite mit Sortierung
dafür brauche ich sortierte Daten
bzw. ich wüsste nicht, wie ich mit XSL bei Sortierung eine "Blätter-Funktion" machen kann
also (nach Sortierung) Ausgabe nur Datensatz 11 bis 20 oder nur Datensatz 21 bis 30 ... etc.
mit Array habe ich es bisher durch array_chunk() gelöst (Array in Teil-Arrays zerlegen)
und je nach Blättern auf Seite den entsprechenden Array-Teil ausgeben
Problem ist, das ich jetzt die Daten nicht mehr als (mehrdimensionales) Array habe
sondern als Objekt-Struktur, und ich habe gehofft, das Sortierung (und Aufteilung) geht damit auch
... aber wie es aussieht, werde ich wohl doch diese Umwandlung von Objekt zu Array brauchen :(
oder? ... wie sonst Objekt-Strukturen mit (nach der) Sortierung durch-blattern (auf Seiten) ?
jemand ne Idee? -
ganz einfach ...
... mit einer Funktion, die eiin Array of Objects sortiert zurückgibt
// ----------------------------------------------------------------- function sort_arr_of_obj($array, $sortby, $direction='asc') { $sortedArr = array(); $tmp_Array = array(); foreach($array as $k => $v) { $tmp_Array[] = strtolower($v->$sortby); } if($direction=='asc'){ asort($tmp_Array); }else{ arsort($tmp_Array); } foreach($tmp_Array as $k=>$tmp){ $sortedArr[] = $array[$k]; } return $sortedArr; } // -----------------------------------------------------------------
$array ... Das Array of Objects
$sortby .... Der Object-Key, nach dem sortiert werden soll
$direction ... Sortier-Rischtung: 'asc' = aufsteigend, 'dsc' = absteigend
Ausgangs-Daten: $object
SimpleXMLElement Object ( [Artikel] => Array ( [0] => SimpleXMLElement Object ( [id] => 1 [title] => Chemie [info] => xxx ... ) [1] => SimpleXMLElement Object ( [id] => 2 [title] => Abend [info] => xxx ... ) [2] => SimpleXMLElement Object ( [id] => 3 [title] => Dosenbier [info] => xxx ... ) [3] => SimpleXMLElement Object ( [id] => 4 [title] => Blumen [info] => xxx ... ) ) )
Aufruf BSP:
$sorted->Artikel = sort_arr_of_obj($object->Artikel,'title','asc');
Ergebnis-Daten: $sorted
SimpleXMLElement Object ( [Artikel] => Array ( [0] => SimpleXMLElement Object ( [id] => 2 [title] => Abend [info] => xxx ... ) [1] => SimpleXMLElement Object ( [id] => 4 [title] => Blumen [info] => xxx ... ) [2] => SimpleXMLElement Object ( [id] => 1 [title] => Chemie [info] => xxx ... ) [3] => SimpleXMLElement Object ( [id] => 3 [title] => Dosenbier [info] => xxx ... ) ) )
somit ist $sorted quasi genau wie $object (Struktur bleibt gleich)
nur ist jetzt in $sorted das Array im Object nach 'title' (aufsteigend) sortiert ... :)
-
Altenativ mit dieser Funktion hier:
private function XMLToArray($XML, $Root = true) { // **************************************************** // Convert the XML into Array // **************************************************** if (!$XML->children()) { return (string)$XML; } $Array = array(); foreach ($XML->children() as $Element => $Node) { $totalElement = count($XML->{$Element}); if (!isset($Array[$Element])) { $Array[$Element] = ""; } if ($Attributes = $Node->attributes()) { // $node got atrributes $Data = array('Attributes' => array(),'Value' => (count($Node) > 0) ? $this->XMLToArray($Node, false) : (string)$Node); foreach ($Attributes as $Attr => $Value) { $Data['Attributes'][$Attr] = (string)$Value; } if ($totalElement > 1) { $Array[$Element][] = $Data; } else { $Array[$Element] = $Data; } } else { // $node contains only values if ($totalElement > 1) { $Array[$Element][] = $this->XMLToArray($Node, false); } else { $Array[$Element] = $this->XMLToArray($Node, false); } } } if ($Root) { return array($XML->getName() => $Array); } else { return $Array; } }
Das SimpleXMLElement in ein Array umwandeln und das Array dann durch multisort() jagen. -
plugboard schrieb:
ganz einfach ...
... mit einer Funktion, die eiin Array of Objects sortiert zurückgibt
...
Aufruf BSP:
$sorted->Artikel = sort_arr_of_obj($object->Artikel,'title','asc');
seit PHP 5 erzeugt $sorted->Artikel eine Meldung:
Warning: Creating default object from empty value
weil die Variable $sorted da noch nicht als Object / stdClass() vorliegt
Lösung: entweder so
$sorted = new stdClass(); $sorted->Artikel = sort_arr_of_obj($object->Artikel,'title','asc');
oder einfach direkt das Array in neue Variable ohne Object
$sorted = sort_arr_of_obj($object->Artikel,'title','asc');
dann hat man das Array direkt in $sorted, und nicht im Object $sorted->Artikel
:=)
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage