2010-12-23 9 views
6


Tengo una matriz de esta manera:inversa funcionalidad gama-como en matrices php

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

y quiero conseguirlo como la siguiente cadena:

0, 2, 4-7, 90+

Cualquier ejemplos por ahí antes de que empiece a sacar pelos de mi cabeza?
Gracias.

ACTUALIZACIÓN:
Aquí está la solución final utilicé después de tomar @ código de Andy, y modificar un poco.

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 ... ¿Tal vez deberías intentar usar alguna * programación * para resolver esto? No estoy tratando de ofenderte, pero esta es una tarea simple si usas tu cerebro un poco. –

+3

Realmente no entiendo cómo todavía hay personas que comentan comentarios como los que acaba de hacer, en sitios creados para que los usuarios hagan preguntas. Si crees que es obvio, no tienes que responder a esta pregunta, pero decirme que puedo intentar hacerlo mediante programación, no ayuda en absoluto. Me gusta ver ejemplos de código. Enriquece mis prácticas de codificación al no apegarse a los paradigmas. – Doron

+1

Este sitio es para cuando tenga problemas con el código, no para cuando no quiera hacer la codificación usted mismo y prefiera que otra persona lo haga por usted. Si hubieras publicado algo que intentaste y no funcionó, habría sido algo completamente diferente. –

Respuesta

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

, por supuesto, suponiendo que la matriz está ordenada; de lo contrario, asort() la matriz primero – Andy

+0

Buena solución, parece funcionar muy bien. +1 –

+0

+1 (Me acabo de dar cuenta de que lo que escribí fue básicamente idéntico a lo que hizo) ... – 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 
     ) 

) 

Se podría añadir un decorador sencilla para dar el 4-7 requerida en lugar de array (4,7). Esto lo dejé porque la vista de los datos debería ser independiente.

Espero que ayude.