un'idea buttata giù in un minuto (e quindi non controllata o studiata):
Codice PHP:
$sorgente 'dati.txt';   
$array_righe file($sorgente);  
$array_appoggio = array();
     
foreach(
$array_righe as $key => $tipo

     list(
$tipo$data$ora$cf ) = explode("_"$cmd);   

     if(!
array_key_exists($cf,$array_appoggio)
    
$array_appoggio[$cf] = array();

    switch(
$tipo){
    case 
1//cf é entrato
        
$array_appoggio[$cf][] = array('data_in' => $data,'ora_in' => $ora,'data_out'=>null,'ora_out'=>null);
        break;
    case 
2//cf è uscito
                    
        //cerco un'entrata senza uscita
        
if(!$array_appoggio[$cf])
        {
            echo 
"ho l'uscita ma non ho l'entrata!";
            break;
        }

        
$f false;
        foreach(
$array_appoggio[$cf] as &$value)
        {
            if(!
$value['data_out'])
            {
                
$f true;
                
$value['data_out']=$data;
                
$value['ora_out']=$ora;
                break;
            }
        }        

        if(!
$f)
            echo 
"ho l'uscita ma non ho l'entrata!!!!";

        break;
    default:
        echo 
"tipo $tipo sconosciuto";
        break;

    }

}


//stampo a video
foreach($array_appoggio as $cf => $entrateUscite){
    echo 
"elenco delle entrate/uscite per il cf $cf\n\n";
    foreach(
$entrateUscite as $entry)
        echo 
sprintf("entrata: %s - uscita: %s \n",$entry['data_in'].' '.$entry['ora_in'],$entry['data_out'].' '.$entry['ora_out']);

vedi un pò te se ti piace la cosa