[Php] Elementi comuni di due array

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
PHP:
<?php
/**
 * non deve essere restituita due volte se in uno dei due array è presente una volta
 * ma solo se in entrambi è presente due volte
 * Es. Presi due array (a, b, b, c) e (a, a, b, b,), il risultato voglio che sia (a, b, b)

 * ma forse il problema andrebbe formulato dicendo,

 * un elemento deve essere presente in tutte e due le array,
 * voglio sapere il minimo delle volte che vi compare
 * comunque faccia il confronto
**/

$a2 = array("a", "a", "b", "b");
$a1 = array("a", "b", "b", "c");

$c1 = array_count_values($a1);
$c2 = array_count_values($a2);

var_dump($c1); echo "<br />"; var_dump($c2); echo "<br />";

foreach ($c1 as $key => $val) {
    if (!empty($c2[$key]))
        echo " Key : ".$key." Value : ".min($val, $c2[$key])."<br />";
}

/**
 * RISULTATO 1

array(2) { ["a"]=> int(2) ["b"]=> int(2) }
array(3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(1) }
 Key : a Value : 1
 Key : b Value : 2

 * RISULTATO 2 (scambiando le array di partenza)

array(3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(1) }
array(2) { ["a"]=> int(2) ["b"]=> int(2) }
 Key : a Value : 1
 Key : b Value : 2

**/
?>

altrimenti qual è la regola da applicare ?
 

JeanWolf

Nuovo Utente
31 Dic 2016
20
0
1
27
Codice:
<?php
/**
* non deve essere restituita due volte se in uno dei due array è presente una volta
* ma solo se in entrambi è presente due volte
* Es. Presi due array (a, b, b, c) e (a, a, b, b,), il risultato voglio che sia (a, b, b)
**/
$a1 = array("a", "a", "b", "b");
$a2 = array("a", "b", "b", "c");

$u1 = array_unique($a1);

$risultato = array_intersect($a2, $u1);

var_dump($risultato);

/**
* RISULTATO
* array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "b" }
**/
?>

Grazie del codice Marino51 ma il mio codice dovrà accettare due array qualunque e processarli nella stessa maniera. Quello che hai fornito tu vale solo per quel caso particolare.

Con mio grande piacere credo di aver quasi trovato la soluzione

Codice:
<?php
$a = array("a", "a", "b", "g", "r", "b");
$b = array("b", "b", "r", "g", "g", "a");

function verifica($array) {
  if (count(array_unique($array)) < count($array)) {
    $array_double = array_diff_assoc($array, array_unique($array)); //seleziono il valore doppio dell'array
  } else {
    break;
  }

  return $array_double;
}


$a_doubles = verifica($a);  //questo array contiene un solo elemento di ciascuna delle coppie di lettere uguali presenti nel primo array
$b_doubles = verifica($b);// idem per il secondo array

/*
print_r($a_doubles);
echo "<br>";
print_r($b_doubles);
echo "<br><br>";
*/

function trova_doppi($new, $new_2) {
  $d = array(); //array che conterrà le eventuali lettere che sono doppie in entrambi gli array

  foreach ($new as $val) {
    if (in_array($val, $new_2)) {
      $d[] = $val;
    }
  }

  return $d;
}

$d = trova_doppi($a_doubles, $b_doubles);

/*
print_r($d);
echo "<br><br>";
*/
  $c = array_unique(array_diff($a, array_diff($a, $b))); //processo i due array senza contare eventuali valori doppi in comune

if (!empty($d)) {
  $c = array_merge($c, $d);  //aggiungo eventuali valori doppi
}

print_r($c);
?>

Ho fatto varie prove con valori doppi e funziona a meraviglia. Peccato solo che in casi in cui ho due array simili: (a,a,a,b) e (a,a,b,b) mi dà (a,a,a)
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
Grazie del codice Marino51 ma il mio codice dovrà accettare due array qualunque e processarli nella stessa maniera. Quello che hai fornito tu vale solo per quel caso particolare.
l'ultimo esempio è valido comunque

però sono molto meglio quei codici lunghi lunghi, meno soggetti ad errori ....
 

JeanWolf

Nuovo Utente
31 Dic 2016
20
0
1
27
Grazie marino51, finalmente ho finito e testato il mio codice. Ora funziona alla perfezione in ogni situazione! Ringrazio anche borgo italia per l'aiuto datomi.

Codice:
<?php
$a = array("b", "h", "r", "r", "h", "g");
$b = array("b", "g", "r", "h", "c", "a");


//controllo se i due array contengono valori ripetuti
if (count(array_unique($a)) < count($a) && count(array_unique($b)) < count($b)) {
    $a_new = array_count_values($a);
    $b_new = array_count_values($b);
  } else {
    $c = array_intersect(array_unique($a), array_unique($b));
    print_r($c);
  }


/*
print_r($a_new);
echo "<br>";
print_r($b_new);
echo "<br><br>";
*/
if (!empty($a_new) && !empty($b_new)) {
  $d = array();

  foreach ($a_new as $key_a => $value_a) {
    foreach ($b_new as $key_b => $value_b) {
      if ($key_a == $key_b && $value_a < $value_b) {
        $array = array_fill(1, $value_a, $key_a);
        $array = array_flip($array);
        $d = array_merge($d, $array);
      } elseif ($key_a == $key_b && $value_a > $value_b) {
        $array = array_fill(1, $value_b, $key_b);
        $array = array_flip($array);
        $d = array_merge($d, $array);
      } elseif ($key_a == $key_b && $value_a == $value_b) {
        $array = array_fill(1, $value_b, $key_b);
        $array = array_flip($array);
        $d = array_merge($d, $array);
      } else {
        continue;
      }
    }
  }
}

/*
$d sarà un'array che avrà come chiavi i valori in comune fra i due array e
per valori il numero minimo di volte in cui compaiono in uno dei due
*/

/*
print_r($d);
echo "<br>";
$array_final = array();
$x = 1;
*/


if (!empty($d)) {
  foreach ($d as $valore => $numero_volte) {
    $x = 1;
    while ($x <= $numero_volte) {
      $array_final[] = $valore;
      $x++;
    }
  }


  print_r($array_final);
}


?>

Se credete poi che debba essere aggiustato od ottimizzato ditemi pure.
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
PHP:
$a = array("b", "h", "r", "r", "r", "h", "g");
$b = array("b", "g", "r", "h", "c", "a", "r");

$a_new = array_count_values($a);
$b_new = array_count_values($b);

$c = array_intersect(array_unique($a), array_unique($b));

$f = array();
$e = array();
foreach ($c as $key) {
    $e[$key] = min($a_new[$key], $b_new[$key]);
    for ($i = 0; $i<$e[$key]; $i++) {
        $f[]=$key;
    }
}
prova così,
array "f" contiene il risultato finale
array "e" le occorrenze "minime", che se non necessarie, anziché l'array si può usare una variabile semplice
risultato

Codice:
array a : Array ( [0] => b [1] => h [2] => r [3] => r [4] => r [5] => h [6] => g )
array b : Array ( [0] => b [1] => g [2] => r [3] => h [4] => c [5] => a [6] => r )

ottimizzato
array finale : Array ( [0] => b [1] => h [2] => r [3] => r [4] => g )

non ottimizzato
array finale : Array ( [0] => b [1] => h [2] => r [3] => r [4] => g )
 
Ultima modifica:

JeanWolf

Nuovo Utente
31 Dic 2016
20
0
1
27
Ti ringrazio del codice di gran lunga più ottimizzato e snello del mio!
 
Discussioni simili
Autore Titolo Forum Risposte Data
S [PHP] Estrarre elementi array su più variabili PHP 5
S elementi statistici - Matrice e Gestione Array PHP o Javascript Javascript 0
alessandra86 [PHP] Elementi di un array non visualizzabili PHP 7
D [PHP] Elementi tabella in orizzontale e NON Verticale PHP 12
C [PHP] RISOLTO - Eliminare elementi duplicati da array multidimensionale PHP 1
otto9due Accesso agli elementi <![CDATA[ ... ]]> di un file XML con SimpleXML e PHP PHP 2
N PHP Ricerca utente, Tabella con più elementi PHP 8
A Nascondere gli elementi di un form con php PHP 5
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4
C Calcoli matematici in php PHP 5
F Scrivere dei dati in word con php PHP 0
D PHP leggere cartella di Windows PHP 1
I dominio aruba versione php server linux Domini 3
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1
S PHP e Mysqli PHP 0
Y Stampare da php su un foglio A6 attraverso una stampante esterna PHP 1

Discussioni simili