kostenloser Webspace werbefrei: lima-city


array_multisort mit Objekte anstatt Array ?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    livesuche

    livesuche hat kostenlosen Webspace.

    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 ?!

  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. livesuche schrieb:
    ... oder muss ich die Objekte immer zuerst in Array umwandeln ? ...
    das ist zwar ein etwas älteres dok., aber ich glaube könnte auch heute noch funktionieren:
    simplexml_load_file sortieren
  4. Autor dieses Themas

    livesuche

    livesuche hat kostenlosen Webspace.

    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?
  5. 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 ... :)

  6. m****r

    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.
  7. 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

    :=)
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!