Alt 18.04.2011, 20:47:55   #1 (permalink)
Erfahrener Benutzer

ID: 174417
Lose-Remote

Reg: 10.03.2007
Beiträge: 666
baserider befindet sich auf einem aufstrebenden Ast
Standard Bereich von Werten einem Maximalwert zuordnen

Hi,

folgendes Problem:

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

PHP-Code:
1:
2:
3:
4:
5:
$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?
baserider ist offline   Mit Zitat antworten
Gesponsorte Links
Alt 18.04.2011, 21:10:57   #2 (permalink)
bekämpft die Mächte des Bösen
Benutzerbild von theHacker

ID: 69505
Lose-Remote

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über AIM schicken theHacker eine Nachricht über MSN schicken theHacker eine Nachricht über Yahoo! schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 20.468
theHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes Ansehen
Standard

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.
theHacker ist gerade online   Mit Zitat antworten
Alt 18.04.2011, 22:26:53   #3 (permalink)
Erfahrener Benutzer

ID: 174417
Lose-Remote

Reg: 10.03.2007
Beiträge: 666
baserider befindet sich auf einem aufstrebenden Ast
Standard

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.
baserider ist offline Threadstarter   Mit Zitat antworten
Alt 18.04.2011, 22:32:55   #4 (permalink)
Erfahrener Benutzer

ID: 217591
Lose-Remote

Aradiv eine Nachricht über ICQ schicken Aradiv eine Nachricht über MSN schicken
Reg: 20.04.2006
Beiträge: 1.543
Aradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer Anblick
Standard

PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
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
Aradiv ist offline   Mit Zitat antworten
Alt 19.04.2011, 07:43:33   #5 (permalink)
bekämpft die Mächte des Bösen
Benutzerbild von theHacker

ID: 69505
Lose-Remote

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über AIM schicken theHacker eine Nachricht über MSN schicken theHacker eine Nachricht über Yahoo! schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 20.468
theHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes Ansehen
Standard

Zitat:
Zitat von baserider Beitrag anzeigen
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-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
/**
 * 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 ) 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.
theHacker ist gerade online   Mit Zitat antworten
Alt 19.04.2011, 10:58:17   #6 (permalink)
return void
Benutzerbild von ice-breaker

ID: 93995
Lose-Remote

ice-breaker eine Nachricht über ICQ schicken
Reg: 27.04.2006
Beiträge: 6.026
ice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehen
Standard

Zitat:
Zitat von Aradiv Beitrag anzeigen
Das ksort kann wegfallen wenn sichergestellt ist das die schlüssel sortiert sind (aufsteigend)
Wenn sie aber nicht sortiert sind hast du einen Aufwand von O(n * log(n)) also eine Ecke mehr als eine lineare Suche.


"Die Wahrheit entgeht dem, der nicht mit beiden Augen sieht." -Orici
ice-breaker ist offline   Mit Zitat antworten
Alt 21.04.2011, 16:34:28   #7 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard

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-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function sucheAltersbezeichnung($alterN){
  if (!
is_numeric($alterN)){
    return 
FALSE;
  } else {
    
$alterN max(0min(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;



Heute schon gepixelt

Geändert von joschilein (21.04.2011 um 17:22:40 Uhr)
joschilein ist offline   Mit Zitat antworten
Alt 21.04.2011, 17:18:06   #8 (permalink)
Erfahrener Benutzer

ID: 217591
Lose-Remote

Aradiv eine Nachricht über ICQ schicken Aradiv eine Nachricht über MSN schicken
Reg: 20.04.2006
Beiträge: 1.543
Aradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer Anblick
Standard

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

Aradiv
Aradiv ist offline   Mit Zitat antworten
Alt 21.04.2011, 17:20:45   #9 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard

Jaja, natürlich ungetestet gemacht


Heute schon gepixelt
joschilein ist offline   Mit Zitat antworten
Antwort

Gesponsorte Links

Anzeige


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[OOo Calc] Formel in einem Bereich ändern theHacker Software/Windows 12 10.05.2010 20:18:33
[PHP] zufallszahl in einem bereich Malo Programmierung 4 27.09.2006 11:09:26
[PHP/MySQL] maximalwert einer Spalte bestimmen Laserdancer2000 Programmierung 4 01.07.2006 19:34:02
Dateitypen zuordnen RoSi Software/Windows 4 04.06.2006 16:07:44


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58:22 Uhr.