Problema con array

  • Creatore Discussione Creatore Discussione Vera
  • Data di inizio Data di inizio

Vera

Utente Attivo
3 Giu 2014
76
1
8
Buongiorno

ho due array;

PHP:
$dati01 = Array();
$dati02 = Array();
$b = 0;
$c = 0;

carico il primo array come di seguito e verifico se il dato caricato nel primo array sia presente nel secondo array con il codice in_array:

PHP:
while($rows =......
{
$dati01[$b]['STRINGA'] = trim($rows['DT0001']).trim($rows['ORINIZ']).trim($rows['ORFINE']);

if(in_array($dati01[$b]['STRINGA'], $dati02))
         {
             echo 'trovato il dato';
         }
         else
         {
             $dati02[$c]['STRINGA'] = $dati01[$b]['STRINGA'];    
             $c++;  
         }
$b++;
}

nel primo array ho diversi record caricati della serie (i dati sotto riportati non sono altro che la concatenazione che ottengo nel ciclo while del primo array):

2015101909001000
2015102010001100
2015102113001400
2015102113001400
2015102113001400

il problema sta nel fatto che il secondo array me lo carica con tutti e 5 i record di sopra, non tenendo conto che a partire dal terzo record (2015102113001400) i successivi sono identici. Per cui vorrei nel secondo array solamente questi record caricati:

2015101909001000
2015102010001100
2015102113001400

Dov'é l'errore???
 
ciao
se ti è possibile inverti gli indici, se provi questo piccolo script vedi che fa quello che vorresti
PHP:
<?php
//tu parti con un array tipo
$dati02['STRINGA'][0] = '2015102113001400';
$dati02['STRINGA'][1] = '2015102113001400';//giusto?
//nel while crei un'altro array tipo
$dati01['STRINGA'][0] = '2015101909001000';
$dati01['STRINGA'][1] = '2015102010001100';
$dati01['STRINGA'][2] = '2015102113001400';
$dati01['STRINGA'][3] = '2015102113001400';
$dati01['STRINGA'][4] = '2015102113001400';//giusto?
/*e vorresti che $dati02['STRINGA'] diventasse
$dati02[0]['STRINGA'] = '2015101909001000';
$dati02[1]['STRINGA'] = '2015102010001100';
$dati02[2]['STRINGA'] = '2015102113001400';//giusto?
*/
$b = 0;
$c = 0;
//simulo il ciclo while con un for
echo "<pre>";
var_dump($dati02);
var_dump($dati01);
for($k=0; $k<=4; $k++){
	if(in_array($dati01['STRINGA'][$k], $dati02['STRINGA'])){
		echo 'trovato il dato<br>';
    }else{
		$dati02['STRINGA'][$c] = $dati01['STRINGA'][$k];    
		$c++;  
	}
}  
var_dump($dati02);
echo "</pre>";
?>
 
Ciao,
tieni presente che i dati (record che ho trasmesso nel mio post) possono essere di più.
In generale il secondo array deve essere scritto solamente se la chiave presente nel primo array non é presente nel secondo array.
Un altro esempio pratico di record presenti nel primo array:

2015100509001000
2015100509001000
2015100509001000
2015100611001200
2015100612001300
2015100809001000
2015100809001000
2015101014001500
2015101014001500

per un totale di 9 record

per cui nel secondo array dovrei trovare scritto solamente:
2015100509001000
2015100611001200
2015100612001300
2015100809001000
2015101014001500

per un totale di 5 record

Vera
 
Perdonami se insisto.
perché il codice cosi' prodotto di seguito non risponde alle mie esigenze.? Cioé il secondo array mi viene caricato di chiavi duplicate....


PHP:
for ($k=0; $k<= count($dati01); $k++)
     {
         if(in_array($dati01[$k]['STRINGA'], $dati02['STRINGA']))
         {
             echo 'trovato il dato<br>'; 
         }
         else
         {
            $dati02[$c]['STRINGA'] = $dati01[$k]['STRINGA'];    
            $c++;
         }    
     }

devo poter filtrare i dati del primo array ($dati01) nel secondo array ($dati02).

Sto perdendo la testa ...........................
 
ciao
quello che continuo a non capire a che ti serva guel ['STRINGA'], soprattutto se è un valore statico e comunque renderebbe il tutto più facile se fosse invertito ['STRINGA'][numero], comunque ribadisco se è statico serve solo a complicare le cose.
devo andare via per un po' poi ti posto un'altro esempio
 
ciao
sperando di aver capito, dai un occhio (eventualmente provalo per vedede se fa il caso tuo), in questo modo ottieni un nuovo array ($dati02) che contiene i dati di $dati01 che non erano già scritti nell'originale $dati02
PHP:
<?php
function verifica($a01, $a02){
	foreach($a01 as $v1){$semplice1[]=$v1['stringa'];}
	foreach($a02 as $v2){$semplice2[]=$v2['stringa'];}
	$semplice1=array_unique($semplice1);//se sei sicura che NON ci siano dati duplicati non serve
	$semplice2=array_diff($semplice1,$semplice2);//togli i valori in comune
	$k=0;
	foreach($semplice2 as $valore){
		$semplice3[$k]['stringa']=$valore;//ritrasformi nella forma [numero]['stringa']
		$k++;
	}
	return $semplice3;
}
echo "<pre>";//questo e i var_dump poi li togli
/* qui avrai il tuo while($rows =.. e la costruzione della stringa
$dati01[]['STRINGA'] = trim($rows['DT0001']).trim($rows['ORINIZ']).trim($rows['ORFINE']);
il $b NON serve ci pensa php a incrementare
e otterrai un array del genere (metto delle lettere per facilitare la lettura)*/
$dati01[0]=array("stringa"=>'aaaa');
$dati01[1]=array("stringa"=>'bbbb');
$dati01[2]=array("stringa"=>'cccc');
$dati01[3]=array("stringa"=>'uuuu');
$dati01[4]=array("stringa"=>'dddd');
$dati01[5]=array("stringa"=>'cccc');
$dati01[6]=array("stringa"=>'dddd');
$dati01[7]=array("stringa"=>'eeee');
$dati01[8]=array("stringa"=>'ffff');
$dati01[9]=array("stringa"=>'dddd');
var_dump($dati01);
//ipotizzioamo che questo sia il secondo array
$dati02[0]=array('stringa'=>'aaaa');
$dati02[1]=array('stringa'=>'ffff');
$dati02[2]=array('stringa'=>'hhhh');// 
var_dump($dati02);
//qui la fine del vhile
$dati02=verifica($dati01,$dati02);//e ottieni un array 02 con i dati di 01 che NON ci sono in 02 originale
var_dump($dati02);
echo "</pre>";
?>
però pensaci ti sertve effettivamente l'arry scritto in quella maniera?
 
stai lavorando con un'array "multidimensionale" credo ci sia qualche problema ad usare la funzione "in_array"

prova così,
PHP:
<?php
$c=0;
$dati02[0]['STRINGA']='';

$dati01[]['STRINGA'] = '2015111111111111'; 
$dati01[]['STRINGA'] = '2015222222222222'; 
$dati01[]['STRINGA'] = '2015222222222222'; 
$dati01[]['STRINGA'] = '2015000000000000'; 
$dati01[]['STRINGA'] = '2015333333333333'; 
$dati01[]['STRINGA'] = '2015222222222222'; 
$dati01[]['STRINGA'] = '2015333333333333'; 
$dati01[]['STRINGA'] = '2015111111111111'; 

for($b=0; $b<count($dati01); $b++)
{
  $OK = false; 
  for($c=0; $c<=count($dati02); $c++)
  {
    if($dati02[$c]['STRINGA'] == $dati01[$b]['STRINGA'])
    {
      echo ' trovato il dato '.$dati01[$b]['STRINGA'].'<br />';
      $OK = true; 
    }
  } 
  if(!$OK)
  { 
    echo ' non trovato il dato '.$dati01[$b]['STRINGA'].'<br />'; 
    $dati02[$c]['STRINGA'] = $dati01[$b]['STRINGA'];
    $c++;  
  } 
}
echo 'DONE!';
?>
risultato
non trovato il dato 2015111111111111
non trovato il dato 2015222222222222
trovato il dato 2015222222222222
non trovato il dato 2015000000000000
non trovato il dato 2015333333333333
trovato il dato 2015222222222222
trovato il dato 2015333333333333
trovato il dato 2015111111111111
DONE!
 
A dire il vero avevo anche io qualche dubbio sulla funzione in_array poiché trattasi di un array multidimensionale. La tua soluzione soddisfa per cui grazie 1000. Grazie anche anche a "borgo Italia".

Vera
 

Discussioni simili