PHP Bereich von Werten einem Maximalwert zuordnen

baserider

Well-known member
ID: 174417
L
10 März 2007
682
23
Hi,

folgendes Problem:

ich habe ien Array erstellt, was als Key ein Höchstalter hat

PHP:
$alter = array(
  10 => 'Kind'
  25 => 'Jugend',
  60 => 'Erwachsen'
)

Wenn nun jemand ein bestimmtes Alter hat, ws gleich oder gleich dem jeweiligen Maximalwert ist, soll die Beschreibung angezeigt werden.
Also jedes Alter von 0-10 soll 'Kind' ausgeben usw.
Git es da eine Funktion in PHP oder eine kurze Lösung?
 
Aufwand: O(n).
Die Liste durchgehen und den höchsten, noch passendsten Wert merken.

Wenn du clever bist, sortierst du aber die Keys vorher. Dann kannst du nämlich sofort aus der Schleife breaken, wenn du einmal die Kleiner-Gleich-Beziehung verletzt siehst.

edit:
Wenn du das häufiger brauchst, kannst du dir auch ein Cache-Array anlegen, was jedem Alter die entsprechende Beschreibung zuordnet.
 
Hi,

danke für den Hinweis. Waren ja doch nur ein paar Zeilen

wie funktioniert denn das mit dem Cache-Array? Habe es mit der Schleife erstmal gelöst.
 
PHP:
function searchMaxKey($array, $value){
    ksort($array);
    end($array);
    while(key($array)>$value){
        prev($array);
    }
    return current($array);
}

Das ksort kann wegfallen wenn sichergestellt ist das die schlüssel sortiert sind (aufsteigend)

Aradiv
 
wie funktioniert denn das mit dem Cache-Array? Habe es mit der Schleife erstmal gelöst.
Genauso, nur, dass du für alle möglichen Werte abfragst und die Ergebnisse zwischen speicherst.

PHP:
/**
 * build cache for age description lookup
 * @param $age: dein $alter-Array
 * @return Map: $age_int -> $age_description
 */
function build_cache($age) {
  ksort($age);
  
  $age_cache = array();
  $cur_age = 0;
  for($age as $max_age => $desc) {
    for($i = $cur_age; $i <= $max_age; $i++)
      $age_cache[$i] = $desc;
    $cur_age = $max_age + 1;
  }

  return $age_cache;
}
Den Cache baust du einmal auf (speicherst ihn ggf. zwischen, wobei hier der Aufwand für deserialisieren und laden wohl größer als ein Rebuild is :LOL:) und kannst beliebig oft Werte nachschlagen.

Idealerweise implementierst du sowas dann als Singleton, wobei die lookup()-Methode dann selbst erkennt, ob sie den Cache erstmals aufbauen muss oder nicht - bzw. in komplexeren Anwendungen, ob er veraltet is und neu aufgebaut werden muss.
 
Ich würde hier auch zu einer einfachen Schleife tendieren. Allerdings in der Definition, dass die Keys das Ab-Alter representieren. Dann muss man nämlich keinen Fehlertext, NULL oder sonstewas abfangen, wenn jemand über der höchsten Definition angesiedelt ist.
Dann noch eine kleine Plausibilitätsprüfung davor und schon sollte die Funktion auslagerungsfähig sein.

PHP:
function sucheAltersbezeichnung($alterN){
  if (!is_numeric($alterN)){
    return FALSE;
  } else {
    $alterN = max(0, min(120, $alterN));
  }
  
  // 1. Keys aufsteigend sortieren
  // 2. Erster Key = 0
  $alterArr = array(0  => 'Kind'
                   ,11 => 'Jugend'
                   ,26 => 'Erwachsen'
                   );

  foreach ($alterArr as $n => $aBez){
    if ($n >= $alterN){
      $alterBez = $aBez;
      break;
    }
  }
  return $alterBez;
}
 
Zuletzt bearbeitet:
Laut deinem Code sind dann aber alles Kinder xD

weil alles zwichen 0 und 120 ist >=0
heißt die 1. Prüfung liefert schon ein true
danach wird abgebrochen.

ergo ist alles Kind :ugly:

Aradiv