Meghatározása unió, metszet vagy különbsége két tömb

feladat
Vannak két tömböt, és szükség van, hogy megtalálja a szövetség (minden elem, de ha az elem benne van mindkét tömbök, akkor csak egyszer), a kereszteződés (elemek tartozó mind a tömb), vagy a különbséget (a tömb elemei, amelyek nincsenek jelen a többi).







döntés
Annak megállapításához, az egyesület:
$ Union = array_unique (array_merge ($ a, $ b));

Kiszámításához a kereszteződés:
$ Metszet = array_intersection ($ a, $ b);

Ahhoz, hogy megtalálja az egyszerű különbség:
$ Különbség = array_diff ($ a, $ b);

És (XOR), így a szimmetrikus különbség:
$ Különbség = array_merge (array_diff ($ a, $ b), array_diff ($ b, $ a));

megbeszélés
Sok a szükséges komponensek ilyen számítások vannak beépítve a PHP, akkor kell csak, hogy összekapcsolják őket a megfelelő sorrendben.

Kézhezvételét követően a kombináció két tömb létrehozása egy hatalmas tömb minden érték a tömb. De a függvény array_merge () lehetővé teszi, hogy az ismétlődő értékeket, amelyet kettő numerikus tömbök, így meg kell hívni array_unique () függvény
hogy kiszűrje az ilyen elemeket.


De lehet kialakítva hézagok array_unique () függvény nem kompakt tömb. Azonban ez nem nehéz, mert a foreach utasításnak, és minden () függvény beavatkozás nélkül ritkán töltött fogantyú tömbök.

Függvény segítségével kiszámíthatja a kereszteződés egy egyszerű név array_intersection (), és nem igényel külön erőfeszítést.

array_diff () függvény egy tömb, amely az összes egyedi tömb elemeit egy $ régi, nem szerepelnek a tömb $ new. Ez az úgynevezett egyszerű különbséget:






$ Old = array ( 'A', 'lehet', 'vagy', 'nem', 'a', 'lesz');
$ New = array ( 'A', 'lehet', 'vagy', 'bármit');
$ Különbség = array_diff ($ régi, $ új);
sor
(
[3] => nem
[4] => a
)

A kapott tömb tartalmaz $ különbség „nem” és a „a”, mivel a funkció array_diff () kisbetű-nagybetű érzékeny. Ez nem tartalmazza a „bármi” elem, mert nem a tömbben $ öreg.

Hogy újra a különbséget, vagy más szavakkal, meg az egyedi elemeket a tömb $ new, nem a tömb $ régi, meg kell cserélni az érveket:
$ Old = array ( 'A', 'lehet', 'vagy', 'nem', 'a', 'lesz');
$ New = array ( 'A', 'lehet', 'vagy', 'bármit');
$ Reverse_diff = array_diff ($ új, $ korig);
sor
(
[3] => bármilyen
)

$ Reverse_diff tömb tartalmazza csupán a „bármi” elem.

Ha azt szeretnénk, hogy alkalmazza a funkció vagy más szűrő array_diff () függvény, beépíteni saját algoritmust találni a különbséget (kivonás):

// alkalmazandó érzéketlen kivonás algoritmus; különbség -i
$ Látták = array ();
foreach ($ új, mint $ n) $ látható [strtolower ($ n)] ++;
>
foreach ($ idős, mint $ o) $ o = strtolower ($ o);
if (! $ látott [$ o]) <$diff[$o] = $o;>
>

Az első foreach utasítás létrehoz egy asszociatív tömb későbbi visszakeresés.


Ezután végigjárjuk a tömb $ régi, és ha a keresés nem talál, akkor hozzáadjuk a tömb $ diff.

Ez a folyamat gyorsítható kombinálásával array_diff () és array_map ():

$ Diff = array_diff (array_map (strtolower ', $ korig),
array_map (strtolower ', $ új));

Szimmetrikus különbség - van valami, hogy tartozik $ a, de nem tartozik a $ b, valamint az a tény, hogy vannak a $ b, de nem $ a:

$ Különbség = array_merge (array_diff ($ a, $ b), array_diff ($ b, $ a));

A telepítés után az algoritmus előre mozog. array_diff () függvényt hívjuk kétszer, és meghatározza a különbség a kettő között. Ezeket azután egyesítjük egyetlen tömb. Nincs szükség okoz array_unique () függvény, mivel ezek a tömbök már kifejezetten, mivel nincs közös eleme van.