cerco di essere conciso per esporre il problema

avendo due file a.txt e b.txt

il primo contiene righe nella forma :

pippo;prova:11766:vC23:S13.0E:27500:512:650:576:0:3401:318:5200:0
il secondo contiene righe nella forma :

4402:161:84=pol,85=eng:1002:161:0
ho scritto questo codice ma due foreach insieme già mi suonano molto strano.. comunque:

codice:
$cona=file(a.txt);
$conb=file("b.txt");
foreach($cona as $line)
  {
  $tline = trim($line);
 $blocks=explode(":",$tline);

foreach($conb as $dati)
  {
  $tdati = trim($dati);
   $blockdati=explode(":",$tdati);
   if ($blockdati[0] == $blocks[9]) {  
   $blocks[5] = $blockdati[1];
   $blocks[6] = $blockdati[2];
   $blocks[7] = $blockdati[5];
   }
  }
 
$final = implode(":",$blocks);;
confronto i dati in grassetto tra i due file

quindi in questo modo confronto se il blocco 9 dell'array dalle linee del file a.txt è presente nel primo blocco dell'array dalle linee del file b.txt

in caso affermativo modifico la linea del file a.txt e mi rischivo il tutto in un file...

volevo sapere se era possibile un codice più snello per fare la medesima cosa? perchè non è raro che mi capiti un

Fatal error: Maximum execution time of 30 seconds exceeded..

Saluti