Matteo Vignoli

Sviluppatore Web Full-Stack autodidatta, curioso per natura,
attualmente impiegato a Milano presso ContactLab per conto di Anoki S.r.L.

array_intersect con un numero variabile di array

  Tempo di lettura:

array_intersect() è una delle tante pratiche funzioni di php per manipolare gli array e come suggerisce il nome viene utilizzato per trovare, tra tutti gli array passati come argomento, gli elementi comuni a quello fornito.
Per trovare l'intersezione tra degli insiemi, in pratica.

array_intersect ( array $array1 , array $array2 [, array $... ] ) : array

Recentemente mi sono trovato di fronte alla necessità di utilizzare questo metodo su un numero variabile di array - o meglio, avevo un array associativo dal numero variabile di elementi chiave => valore dal quale dovevo estrapolare l'elemento comune a tutti gli array presi in considerazione.
Questo il JSON di partenza:

{"serie_1":["1920","1919","1802","1800","1798","1796","1794","1792"], "serie_4":["1919","1796"], "serie_3":["1920","1919"], "serie_5":["1920","1919","1852","1850","1848","1846","1844","1842","1840","1838","1836","1818","1816","1814","1812","1810","1808","1806","1804","1802","1800","1798","1796","1794","1792"]}

I problemi qui sono due: il numero di serie disponibili non è sempre fisso (da 1 a 5), e alcune di queste serie possono esssere presenti  ma vuoti (ossia senza alcun elemento). Dopo alcuni tentativi e ricerche su StackOverflow sono arrivato a questa soluzione:


// Riduco l'array di partenza rimuovendo tutti gli array vuoti
$filtrati = array_filter($sequenza, function($val) {
	return !empty($val);
});

$comune = call_user_func_array('array_intersect', $filtrati);

Bisogna però fare attenzione : `array_intersect()` si aspetta almeno due elementi (un array di base ed uno per confrontarne gli elementi), quindi bisogna controllare che l'array di  input contenga almeno due elementi. Sistemato un po' diventa:


$serie = json_decode('{"serie_1":["1920","1919","1802","1800","1798","1796","1794","1792"], "serie_4":["1919","1796"], "serie_3":["1920","1919"], "serie_5":["1920","1919","1852","1850","1848","1846","1844","1842","1840","1838","1836","1818","1816","1814","1812","1810","1808","1806","1804","1802","1800","1798","1796","1794","1792"]}', true);
 
/**
 * @param array $needle
 * @return mixed 
 */
function pickCommonElement($needle) {
	// Remove empty arrays
	$filtered = array_filter($needle, function($val) {
		return !empty($val);
	});
 
	if (count($filtered) > 1) {
	  $common = call_user_func_array('array_intersect', $filtered);  
	  $len = count($common);
 
	  if ($len == 1) {
		 return array_shift($common);
	  }
	}
	return null;
}

var_dump(pickCommonElement($serie));
string(4) "1919"

Qui uso array_shift($common); perchè array_intersect() mantiene le chiavi originali dell'array, e dovendo recuperare solo il primo elemento mi pareva il metodo più comodo e rapido per farlo.

Decorazioni e luci per il Presepe: un semplice focolare con alternanza giorno/notte usando Arduino

Da tempo avevo voglia di smanettare un po' con Arduino, da prima ancora di quando, almeno due anni fa, mi fu regalato quello Starter Kit che...

Creare un blog gratuito con Jekyll e Netlify in pochi minuti - parte 1

I generatori di siti statici (Static Site Generators) sono uno dei trend che hanno fatto la loro comparsa in questi anni nel mondo dello sviluppo web;...

MatteoVignoli.it   Non perderti nulla da MatteoVignoli.it, ricevi aggiornamenti via mail.