Scusa, ma non capisco il senso di quel che fai...
Hai una array di valori ($a = $_POST['nome']) che ti scorri con
while(list(,$value) = each($a))
Presumo che questi tutti valori contengano un '|', visto che poi fai l'explode su quel carattere.
Ad esempio : $a=array('111|222', '222|333', '333|444');
A questo punto fai l'explode ed effettivamente (se i valori contengono uno | ) dovresti avere ad esempio $barc1=111 e $barc2=222
Fai la query e aggiorni il record con id_lotti = $idi.
Ma a questo punti rinizia il ciclo del while con il seguente elemento di $a (222|333) e dopo l'explode rifai la query, sovrascrivendo i valori di barc1 e barc2 ($idi e sempre lo stesso)
PS: per evitare problemi con gli apici e di sql injection, usa mysql_real_escape_string() e non str_replace
PS2: ma al posto del while(list() = each()), non è meglio usare foreach($a as $value) ?