2011-10-19 1 views
5

Ho provato a cercarlo sia qui che su Google, quindi se ho perso qualcosa di ovvio, mi scuso. È possibile che semplicemente non conosca il nome per la formattazione di questi numeri.PHP: Esiste un modo semplice per analizzare un elenco di numeri (come una stringa, come "1-3,5,7-9") in un array?

Quello che sto cercando di fare è iniziare con una stringa, come "1-3,5,7-9" e trasformarlo in un array PHP con le seguenti voci: 1,2,3,5 , 7,8,9

So come farlo utilizzando preg_split su una virgola, quindi eseguendo l'iterazione e l'espansione di qualsiasi segno, ma mi sembra che ci debba essere un modo più semplice/migliore.

EDIT

non ho fatto questo chiaro, ma la stringa deve includere LUCI! Ciò significa che se la mia stringa era "1-9" il mio array risultante dovrebbe essere "1,2,3,4,5,6,7,8,9" NON SOLO "1,9". Ci scusiamo per il fatto che non sia chiaro prima.

+1

si guardò esplodere? http://php.net/manual/en/function.explode.php –

+5

Sono contento che tutti qui leggano la domanda da vicino ... – animuson

+0

Ho modificato il post ... il mio problema è con span, come "1-5 "deve risultare in" 1,2,3,4,5 "non solo" 1,5 " – Bing

risposta

11

Non completamente sicuro di cosa intendi con "espansione". In ogni caso, ecco come lo farei con explode e range:

$input = '1-3,5,7-9'; 
$output = array(); 

foreach (explode(',', $input) as $nums) { 
    if (strpos($nums, '-') !== false) { 
     list($from, $to) = explode('-', $nums); 
     $output = array_merge($output, range($from, $to)); 
    } else { 
     $output[] = $nums; 
    } 
} 

Se c'è un modo migliore che non utilizza eval (o PCRE e modificatore), io non conosco nessuna.

Ecco, per il tuo divertimento, una battuta (che utilizza purtroppo eval) che restituisce lo stesso risultato, ma ...

responsabilità: Usando eval non è raccomandato nella maggior parte dei casi, perché può creare rischi per la sicurezza e altri problemi. Non lo userei ma è ancora fattibile.

Detto questo, qui è:

$output = explode(',', preg_replace('/([0-9]*)-([0-9]*)/e', 'implode(",", range($1, $2));', $input)); 
+0

Questo ha funzionato, grazie! – Bing

1

non so di una semplice costruito in modo, come non è qualcosa che è tutti i comuni Dubito che ci sia qualcosa di costruito in.

Il modo in cui si sta descrivendo suona come un approccio ragionevole. È possibile farlo con una singola iterazione attraverso la stringa, ma a meno che non si tratti di un problema di prestazioni noto, non mi preoccuperei di farlo.

+0

+1 Ho decisamente trascurato il si estende e li ha visti come delimitatori. – Josh

1
$str = '1-3,5,7-9'; 
$arr = explode(',', $str); 
$result = array(); 
foreach($arr as $a){ 
    $x = explode('-', $a); 
    if(count($x) === 2){ 
    $x = range($x[0], $x[1]); 
    } 
    $result = array_merge($result, $x); 
} 
print_r($result); 

Non so quanto efficace questo è, ma ottiene il lavoro fatto.

0

Sono andato via per fare questo e torno a vedere 2 risposte già. :(

<?php 
function arrex($s){ 
    $arr = explode("-", $s); 
    $v=$arr[0] + 1; 
    $val = array(); 
      while($v!=$arr[1]){ 
       $val[$v] = $v; 
        $v++; 
      } 
    array_unshift($val, $arr[0]); 
    array_push($val, $arr[1]); 
return $val; 
} 
$s = "1-9"; 
print_r(arrex($s)); 
?> 

uscite

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 4 
    [4] => 5 
    [5] => 6 
    [6] => 7 
    [7] => 8 
    [8] => 9 
) 
1

La routine sopra funziona bene ma ha una serie di carenze:

  1. spazi nella stringa sconvolto la routine
  2. duplicati non vengono rimossi esempio5,4-7 restituisce 5,4,5,6,7
  3. I numeri non sono ordinati.

ho cambiato il codice per risolvere questi problemi:

function parsenumbers($input) 
{ 
    /* 
    * This routine parses a string containing sets of numbers such as: 
    * 3 
    * 1,3,5 
    * 2-4 
    * 1-5,7,15-17 
    * spaces are ignored 
    * 
    * routine returns a sorted array containing all the numbers 
    * duplicates are removed - e.g. '5,4-7' returns 4,5,6,7 
    */ 
    $input = str_replace(' ', '', $input); // strip out spaces 
    $output = array(); 
    foreach (explode(',', $input) as $nums) 
    { 
     if (strpos($nums, '-') !== false) 
     { 
      list($from, $to) = explode('-', $nums); 
      $output = array_merge($output, range($from, $to)); 
     } 
     else 
     { 
      $output[] = $nums; 
     } 
    } 

    $output = array_unique($output, SORT_NUMERIC); // remove duplicates 
    sort($output); 

    return $output; 
}