2010-12-23 13 views
6


Ich habe ein Array wie folgt aus:in PHP Arrays

array(0, 2, 4, 5, 6, 7, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99); 

und ich möchte es als eine der folgenden Zeichenkette erhalten:

0, 2, 4-7, 90+

Alle Beispiele da draußen, bevor ich anfange Haare aus meinem Kopf zu ziehen?
Danke.

UPDATE:
Hier ist die letzte Lösung, die ich nach dem @ Andy nehmen verwendeten Code, und es ein wenig zu verändern.

function rangeArrayToString($rangeArray, $max = 99) { 
    sort($rangeArray); 
    $first = $last = null; 
    $output = array(); 

    foreach ($rangeArray as $item) { 
     if ($first === null) { 
      $first = $last = $item; 
     } else if ($last < $item - 1) { 
      $output[] = $first == $last ? $first : $first . '-' . $last; 
      $first = $last = $item; 
     } else { 
      $last = $item; 
     } 
    } 

    $finalAddition = $first; 

    if ($first != $last) { 
     if ($last == $max) { 
      $finalAddition .= '+'; 
     } else { 
      $finalAddition .= '-' . $last; 
     } 
    } 

    $output[] = $finalAddition; 

    $output = implode(', ', $output); 
    return $output; 
} 
+1

Erm ... Vielleicht sollten Sie versuchen, einige * Programmierung * zu verwenden, um das zu lösen? Ich versuche nicht, dich zu beleidigen, aber das ist eine einfache Aufgabe, wenn du dein Gehirn ein wenig verwendest. –

+3

Ich verstehe wirklich nicht, wie es immer noch Leute gibt, die Kommentare kommentieren, wie Sie es gerade getan haben, auf Seiten, die für Benutzer gemacht wurden, um Fragen zu stellen. Wenn Sie denken, dass es ein Klacks ist, müssen Sie diese Frage nicht beantworten, aber mir zu sagen, dass ich es durch Programmierung versuchen kann, hilft überhaupt nicht. Ich sehe gerne Codebeispiele. Es bereichert meine Programmierpraktiken, indem ich mich nicht an Paradigmen halte. – Doron

+1

Diese Seite ist für den Fall, dass Sie Probleme mit dem Code haben, nicht für den Fall, dass Sie die Codierung nicht selbst vornehmen möchten und es vorziehen würde, dass jemand anderes dies für Sie tut. Wenn du etwas gepostet hast, das du ausprobiert hast und nicht funktioniert hast, wäre es etwas völlig anderes. –

Antwort

11
$first = $last = null; 
$output = array(); 

foreach ($array as $item) { 
    if ($first === null) { 
     $first = $last = $item; 
    } else if ($last < $item - 1) { 
     $output[] = $first == $last ? $first : $first . '-' . $last; 
     $first = $last = $item; 
    } else { 
     $last = $item; 
    } 
} 

$output[] = $first == $last ? $first : $first . '+'; 
$output = join(', ', $output); 
+0

natürlich vorausgesetzt, das Array ist sortiert, sonst asort() das Array zuerst – Andy

+0

Schöne Lösung, scheint gut zu funktionieren. +1 –

+0

+1 (Ich erkannte gerade, was ich schrieb, war im Grunde identisch mit dem, was Sie getan haben) ... – ircmaxell

0
function makeRange($array, $last=array(), $done=array()){ 
    if ($array == array()) { 
     return $done; 
    } 

    $h = $array[0]; 
    $t = array_slice($array, 1); 

    if ($last == array()) { 
     $last = array($array[0], $array[0]); 
    } 
    if ($t[0] == 1 + $last[1]) { 
     return makeRange($t, array($last[0], $h+1), $done); 
    } 
    $done[] = $last; 
    return makeRange($t, array(), $done); 
} 

print_r(makeRange(array(1,2,3,5,6,7, 9, 11,12,13,18))); 

// Output 

Array 
(
    [0] => Array 
     (
      [0] => 1 
      [1] => 3 
     ) 

    [1] => Array 
     (
      [0] => 5 
      [1] => 7 
     ) 

    [2] => Array 
     (
      [0] => 9 
      [1] => 9 
     ) 

    [3] => Array 
     (
      [0] => 11 
      [1] => 13 
     ) 

    [4] => Array 
     (
      [0] => 18 
      [1] => 18 
     ) 

) 

Sie einen einfachen Dekorateur die erforderliche 4-7 anstelle von Array zu geben (4,7) hinzufügen könnte. Dies habe ich weggelassen, weil die Ansicht der Daten getrennt sein sollte.

Hoffnung, das hilft.