kostenloser Webspace werbefrei: lima-city


Größte Zahl in 2D Array finden ?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    inetbox

    inetbox hat kostenlosen Webspace.

    Hallo

    ich habe ein (2D) Array wie zum Beispiel: $data

    $data = array(); 
    
    $data[0]['name'] = 'Max Mustermann'; 
    $data[0]['alter'] = 28;
    $data[0]['beruf'] = 'Montagsmaler'; 
    $data[0]['punkte'] = 4; 
    
    $data[1]['name'] = 'Angelika Bein'; 
    $data[1]['alter'] = 22;
    $data[1]['beruf'] = 'Dessou Model'; 
    $data[1]['punkte'] = 9; 
    
    $data[2]['name'] = 'Papa Schlumpf'; 
    $data[2]['alter'] = 62;
    $data[2]['beruf'] = 'Chef vom Dienst'; 
    $data[2]['punkte'] = 2; 
    
    $data[3]['name'] = 'Tamara Trimm'; 
    $data[3]['alter'] = 19;
    $data[3]['beruf'] = 'Sport-Studentin'; 
    $data[3]['punkte'] = 7;


    wie kann ich daraus am einfachsten die größte Zahl (für alter oder punkte) ermitteln ?
    .. ab besten ohne das ganze Array in einer Schleife zu durchlaufen, ... (wie) geht das ?

    so bekomme ich es zwar hin, ist aber wohl nicht gerade performant


    $max_age = 0; 
    $res_key = NULL; 
    
    foreach($data as $key => $item) { 
      if ($max_age < $item['alter']) { $max_age = $item['alter']; $res_key = $key; } 
    }
    
    print '<p>Alter: '.$max_age.' &nbsp;&nbsp; ID: '.$res_key.'</p>';


    gibt es eine bessere Möglichkeit direkt (ohne for / foreach Schleife)
    die größte Zahl (inkl. key) in einem (2D) Array heraus zu finden ?

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

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

  3. Es gibt einen performanteren Weg den größten Wert zu ermitteln: Wenn der Array schon sortiert ist.
    Anders hast du keine Möglichkeit den größten Wert zu ermitteln ohne den gesamten Array zu durchlaufen.
    Möglichkeiten wären noch eine Art Cache zu bauen. Da machst du eine Klasse, die eine Methode zum hinzufügen hat. Beim Hinzufügen wird überprüft, ob das neue Element das größte Alter hat und setzt gegebenenfalls ein Eigenschaft des Objektes auf den neuen Wert.
    Kann nicht garantieren, dass das fehlerfrei ist, aber soll dir ungefähr einen Eindruck geben:
    class BiggestCache {
        private $properties = null;
        private $maxvalues = array();
        private $elements = array();
    
        public function __construct($properties) {
            $this->properties = $properties;
        }
    
        public function AddElement($element) {
            $this->elements[] = $element;
            $key = count($this->elements) - 1;
            foreach($this->properties as $property) {
                if (isset($element[$property]) && $this->GetBiggestValue($property) < $element[$property]) {
                    $this->SetBiggest($property, $key)
        }
    
        public function GetElement($key) {
            return $this->elements[$key];
        }
    
        public function GetBiggest($property) {
            if(isset($this->maxvalues['$property']) {
                return $this->maxvalues['$property'];
            }
            return null;
        }
    
        public function GetBiggestValue($property) {
            $biggest = $this.>GetBiggest($property);
            if(!is_null($biggest)) {
                return $this->GetElement($biggest);
            }
            return null;
        }
    
        private function SetBiggest($property, $key) {
            $this->maxvalues[$property] = $key;
        }
    }
    
    $biggestcache = new BiggestCache(array('alter'));

    Aber Achtung GetBiggestValue kann null zurückgeben, wenn der Wert tatsächlich null ist, aber auch wenn er nicht bestimmt sit!

    Beitrag zuletzt geändert: 27.4.2014 18:25:01 von reimann
  4. mein Ansatz wäre ein Binärbaum aus diesen Objekten aufzubauen, jedoch würde sich ein Binärbaum nur mit der suche nach einem Attribut beschränken. Sortierung fällt damit auch flach, weil man nur nach einem Attrib sortiert, oder die liste parallel in einer Anderen sortierung laufen lässt.

    Der binrbaum lässt sich am elegantesten in C lösen, aber es gibt auch Leute, die sich das versucht haben in PHP anzutun:

    http://www.phpmonkeys.de/2010/10/06/binary-trees/

    wir kommen hier jedoch in die Ansätze Objektorientierter Programmierung rein. Performance beim erstellen ist langwierig, zumal wenn man den baum ausbalanciert, die Suche sollte auch für größere Datenmengen Rasend-Schnell gehen. wenn du mehrere Attribute durchsuchen willst, wirst du nciht umhin kommen, 2 Bäume Parallel zu fahren...

    Außerdem hat der Server dann einen etwas erhöhten RAM-Bedarf... wenn jede einzelne Session dann 2 Bäume aufbaut, die auf dein Daten-Array verweisen... Aktuell halten dürfte auch schwieriger fallen...

    anderer Ansatz wäre das teil als mySQLlite-Objekt abzuwerfen und über SQL sich die dinge raussuchen lassen, das dürfte der effektivste Weg sein. oder gleich über eine Volwlertige Datenbank, irgendwo bekommst du die daten ja her...

    Beitrag zuletzt geändert: 28.4.2014 13:46:58 von sebulon
  5. 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!