ChrisB: Hilfe beim Aussortieren

Beitrag lesen

Hi,

Also da faellt mir erst mal nichts besseres ein, als das ganze in einer Schleife zu durchlaufen, und zu schauen, wie lange man aufeinanderfolgende Indices vorfindet. Dabei die Laenge des laengsten (der wird ja gesucht, richtig?) bisher gefundenen zusammenhaengenden Blockes merken, sowie seinen "Startindex". Wenn nachfolgend noch ein laengerer auftritt, dann den bisherigen verwerfen, und den neuen merken ...

So, hier mal ein Beispiel, basierend auf deinem ersten genannten Array, zu Testzwecken etwas erweitert:

$A = array(  
7 => 'a',  
9 => 'b',  
10 => 'c',  
11 => 'd',  
18 => '475,447',  
19 => '474,446',  
20 => '473,446',  
21 => '472,446',  
22 => '471,446',  
39 => '469,457',  
40 => '469,458',  
42 => '471,458');  
  
$actStart = $maxStart = $maxLength = 0;  
$actLength = 1;  
$prevIndex = -2; // muss fuer Vergleich kleiner als kleinster denkbarer Index (0) minus eins sein  
  
foreach($A as $index => $value) { // Schleife ueber Array-Elemente  
  if(!$actStart) { // aktuellen Startindex erstmalig auf ersten Index setzen; wichtig, wenn laengster Block direkt am Anfang des Arrays beginnt, dortiger Index aber nicht 0 ist  
    $actStart = $index;  
  }  
  if($prevIndex == $index-1) { // wenn aktueller Index direkter Nachfolger des vorherigen ist  
    $actLength++; // aktuelle Blocklaenge um eins erhoehen  
  }  
  else { // Indices sind nicht fortlaufend  
    if($actLength > $maxLength) { // neuer laengster Block gefunden  
      $maxLength = $actLength; // neue maximale Blocklaenge merken  
      $start = $actStart; // Startindex des neuen Blocks merken  
    }  
    $actLength = 1; // Laenge des neuen potentiellen Blocks initialiseren  
    $actStart = $index; // Startindex des neuen potentiellen Blocks ist aktueller Index  
  }  
  $prevIndex = $index; // Merker "vorheriger Index" fuer naechsten Durchlauf auf aktuellen Index setzen  
}  
  
echo 'longest block found beginning at index '.$start.', length '.$maxLength.' entries';

Gibt fuer das vorliegende Array aus:

longest block found beginning at index 18, length 5 entries

  • ist doch das, was du in dem Fall haben wolltest, wenn ich dich jetzt nicht total missverstanden habe.

(Die Werte aus dem Array bekaeme man dann ueber eine anschliessende For-Schleife, die bei 18 beginnt und bis 18+5-1 laeuft - da liegen ja jetzt definitiv fortlaufende Indices vor, also tut's hier die simple For-Schleife.)

Der Sonderfall des "Ueberlaufs" waere dann nochmal gesondert zu beruecksichtigen.

Das hab' ich da jetzt noch nicht gemacht - your part :-)

MfG ChrisB