2015-05-24 2 views
1

битовый поток:битное расположение изменение битового потока

0 0 0 1 1 1 1 0 0 1 1 0 0 0 1 0 

желательно outbpu:

4-7,10-11,15 

моя функция:

$flag = 0; 
$str = ''; 
for($i=0; $i < count($array); $i++){ 
    if(0 == $array[$i]){ 
     $flag = 0; 
     continue; 
    } 
    if($i > 0 && $session_array[$i] == $session_array[$i-1]){ 
     $flag = 1; 
     continue; 
    } 
    $str .= (string)$i+$flag . ','; 
} 

Но это не дает желаемых результатов. какие-либо предложения?

+0

Я на это - почти сделано. – Falt4rm

+1

Как вы можете получить эти 5 номеров из этих 16 цифр? – Rizier123

+0

@ Rizier123 '4-7',' 10-11' и '15' - это диапазоны позиций, где находятся« бит 1 ». – Hkan

ответ

1

Вариант с array_reduce

$s = '0 0 0 1 1 1 1 0 0 1 1 0 0 0 1 0'; 

$array = explode(' ', $s); 

$output = ''; 
// to make count from 1 but 0 
array_unshift($array, 0); 
// keys with value 1 
$keys = array_keys($array, 1); 
$c = array_reduce ($keys, function($c, $item) use (&$output) { 
    if ($c[0] == -1) return array($item, $item); 
    if($item == $c[1]+1) return array($c[0], $item); 
    $output .= ($c[0] == $c[1] ? $c[0] : implode('-', $c)).','; 
    return array($item,$item); 
}, array(-1,-1)); 

$output .= ($c[0] == $c[1] ? $c[0] : implode('-', $c)); 
echo $output; 

результат 4-7,10-11,15

Смежные вопросы