array_diff: per fare un controllo incrociato bisogna invertire gli array?

Ho fatto una prova con array_diff per verificare se ne avevo capito il funzionamento.

La mia esigenza è controllare che due array siano identici e in caso contrario indicare le differenze.

esempio:

<?php
$arr1 = array (1,2,3);
$arr2 = array (0,1,2,3);


$res1 = array_diff($arr1, $arr2);
$res2 = array_diff($arr2, $arr1);

if (!empty($res1)) {

   echo "<pre>";
   print_r ($res1);
   echo "</pre>";

}

if (!empty($res2)) {

   echo "<pre>";
   print_r ($res2);
   echo "</pre>";

}

?>

$res1 sarà vuoto, ma $res2 invece è pieno...

c'è un modo più elegante per ottenere questo?

inviato 10 anni fa
arjuna
X 0 X

Non credo che si possa fare altro  :dunno:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Per il momento ho fatto così, ma mi sembra strano che non ci sia una funzione che faccia una cosa così semplice, se dovessi confrontare 3 array che faccio?

il primo col secondo, il secondo col primo, li unisco e li confronto prima col terzo e poi il terzo con loro?

risposto 10 anni fa
arjuna
X 0 X

Prova a vedere nel manuale di PHP se tra le funzioni che lavorano con gli array c'è qualcosa che può tornarti utile. Ma non credo...

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ho gia visto all'inizio, prima di postare, non ho trovato nulla di utile...

risposto 10 anni fa
arjuna
X 0 X

Forse la sto sparando grossa....ma se utilizzassi array_intersect all'interno di un foreach?

ciuaz

risposto 10 anni fa
Thesee
X 0 X

in che senso?

risposto 10 anni fa
arjuna
X 0 X

Come da manuale php array_intersect restituisce un array contenente tutti i valori dell' array controllato che siano presenti in tutti gli array passati come argomento.

Quindi mi viene in mente di poter fare una sorta di ciclo all'interno del quale verifico il risultato dell'intersect facendo un count dell'originale e del risultato .

Se il count è uguale, gli array sono uguali, se no vedi le differenze con array_diff.

il ciclo è neccessario nel momento in cui hai piu array da verificare rispetto ad uno.

Ciao

risposto 10 anni fa
Thesee
X 0 X

Dimenticavo cosa molto semplice che passa sempre inosservata:

if ($array1 == $array2)

è una sisntassi valida e funzionale

http://it2.php.net/manual/it/language.operators.array.php

Magari fa risparmiare array_intersect ;)

risposto 10 anni fa
Thesee
X 0 X

ma non mi dice quali sono le differenze

risposto 10 anni fa
arjuna
X 0 X

La risposta è negli ultimi miei 2 post

Aggiungo che per logica (con array_diff) se devi fare una difrerenza fra array come richiedi tu, dovrai mergiare i 2 risultati.

Se devi verirficare la differenza fra piu array, devi costruirti un algoritmo per ciclarli.

(tenendo conto che in genere una differenza di array si fa sempre rispetto ad un campione. Se esci da questo schema forse la logica di cio che fai non è standard e magari si puo fare in altra maniera :) )

Puo magari aiutarti anche quest truchetto:

se l' array_unique($arr1 + $arr2) è uguale a $arr1 allora $arr2 è totalmente contenuto in $arr1.

Comunque forse questo puo fare a caso tuo, direttamente da php.net

<?php
/*rudigier at noxx dot at
09-Feb-2005 07:53
if you don't like the php diff (like me) then take look at my diff functions

if you have two arrays, lets say:

a1 = { blue, red, green }
a2 = { blue, yellow, green }

array_diff just gives me nothing, although there is a difference. instead of an empty array, i needed an array which should contain "red" and "yellow" in this case.

single_diff satisfies my wish.
*/
function single_diff(&$a1,&$a2)
{
  $r = array(); // return
  
  foreach ($a1 as $pl) // payload
  {
   if (! in_array($pl, $a2, true) )
     $r[] = $pl;
  }
  
  foreach ($a2 as $pl) // payload
  {
   if (! in_array($pl, $a1, true) && ! in_array($pl, $r, true) )
     $r[] = $pl;
  }
  return $r;
}
/*
--------------------
this one just keeps the keys of the arrays in mind by comparing the values directly. just in case if there are values, which might occur multiple in one of these arrays.
*/
function single_diff_assoc(&$a1,&$a2)
{
  $r = array(); // return
  
  foreach ($a1 as $k => $pl) // payload
  {
   if (! isset($a2[$k]) || $a2[$k] != $pl)
     $r[$k] = $pl;
  }
  
  foreach ($a2 as $k => $pl) // payload
  {
   if ( (! isset($a1[$k]) || $a1[$k] != $pl ) && ! isset($r[$k]) )
     $r[$k] = $pl;
  }
  return $r;
}
/*
recursion support might be useful, but feel free to modify this functions to your own purposes.
*/
?>

ciauz ;)

risposto 10 anni fa
Thesee
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda