Come filtrare valori di un array

samurai.sette

Utente Attivo
17 Dic 2015
235
6
18
Ciao a tutti.
Come da titolo ho la necessità di filtrare un array eliminando da esso tutti quei valori che si discostano in maniera eccessiva dagli agli.
Faccio un esempio.
PHP:
array (0.13 , 0.12 , 0.15 , 7 , 0.11 , 5);
Come potete vedere nell'array che ho scritto i valori riportati sono tutti molto simili tra loro ad eccezione del quarto valore (7) e dell'ultimo valore (5).
Ciò che vorrei riuscire a fare è questo: se nell'array dovesse capitare un valore abnorme rispetto agli altri (in questo caso il 7 e il 5), questi devono essere eliminati dall'array.
Preciso che l'array viene creato e valorizzato da un Arduino che invia progressivamente i valori in maniera automatica; qualche volta può capitare che il valore inviato sia "sballato".
Qualcuno ha un'idea su come potrei procedere?
Ciao, grazie mille.
 

f107

Utente Attivo
7 Ago 2012
206
6
18
Roma
Ciao!

secondo me hai due possibilità, PHP ha la funzione array_filter che fa al caso tuo (qui maggiori info).
Se hai dei valori di soglia tipo minimo e massimo noti potresti fare così:
PHP:
$min = 0;
$max = 2;

$valueBetween = function($value) use($min, $max) {
    return $value && $min < $value && $value < $max;
};

$result = array_filter($array, $valueBetween);

var_dump($result);

Se invece vuoi una cosa più "dinamica" potresti decidere un valore massimo di differenza tra la media dei valori presenti nell'array, esempio:
PHP:
// max diff value
$delta_max = 2;

// remove null
$array = array_filter($array);

$avg = array_sum($array) / count($array);

$avgDiff = function($value) use($delta_max, $avg) {
    return abs($value - $avg) < $delta_max;
};

$result = array_filter($array, $avgDiff);
var_dump($avg, $result);

Nel secondo caso attenzione, che se i numeri che ritornano sono tanto più alti (ad esempio 100) non funziona più come logica, Vedi tu.

Sono solo dei piccoli spunti, spero ti siano utili
 
Ultima modifica:

samurai.sette

Utente Attivo
17 Dic 2015
235
6
18
Ciao f107, grazie per la risposta.
Per quanto riguarda la tua prima idea tenderei a escluderla perché non posso impostare un valore minimo e un valore massimo a priori.

La tua seconda idea è sicuramente più funzionale anche se anche qui non posso impostare un valore massimo di differenza tra la media dei valori.

Ti faccio un esempio reale di dati inviati da un arduino per circa un anno e mezzo (dati giusti). Inizialmente questi dati avevano un valore di circa 0.20 per poi aumentare progressivamente fino a circa 4.03
Capisci bene che prima di iniziare a inviare i dati con arduino non ho modo di sapere quali valori impostare nelle tue due idee.

Sono comunque due buone idee (soprattutto la seconda).
 
  • Like
Reactions: f107

f107

Utente Attivo
7 Ago 2012
206
6
18
Roma
Ok, ora mi è più chiara la situazione, dipende da molte cose, ad esempio l'incremento che andamento segue? Lineare? Solitamente quanti valori sballati hai?

Puoi pensare a varie strategie comunque:
https://it.wikipedia.org/wiki/Scarto_quadratico_medio oppure meglio questa https://it.wikipedia.org/wiki/Deviazione_mediana_assoluta
se vuoi farlo più semplice, e sei sicuro che avrai più valori corretti che fuori set, puoi modellare la seconda opzione che ti avevo dato e usare come delta_max una percentuale ragionevole

Spero siano spunti utili
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
Simile a quanto suggerito da @f107 , una media della differenza assoluta tra gli elementi dell'array eliminando il massimo ed il minimo, in pratica il delta lo calcola lui...
La stesura non è bella volutamente!
PHP:
function calcolaMediaStep($data){
   $dati=[];
   for($i=1;$i<count($data);$i++){
      $dati[]=abs($data[$i-1]-$data[$i]);
   }
   return array_sum(array_diff($dati,[min($dati),max($dati)]))/count($data);
}
function createNewArray($data){
   $makeDiff=calcolaMediaStep($data);
   $local=[];
   foreach ($data as $items){
      ($items<=$makeDiff)?$local[]=$items:null;
   }
   return $local;
}

$demo=array (0.13 , 0.12 , 0.15 , 7 , 0.11 , 5);
$arr=createNewArray($demo);
dd($arr);
 
  • Like
Reactions: f107
Discussioni simili
Autore Titolo Forum Risposte Data
M Filtrare risultati con valori checkbox passati con jquery jQuery 2
W Excel come filtrare una tabella Windows e Software 2
S filtrare database mysql MySQL 3
A Strumenti per filtrare il css HTML e CSS 1
N [PHP] filtrare input form di tipo array PHP 0
giancadeejay php WHERE per filtrare PHP 4
giancadeejay Filtrare dati tabella mysql ed estrarli PHP 4
S [PHP] Filtrare nomi tabelle DB PHP 6
S filtrare dati in query MS Access 3
D Filtrare dati da tabella PHP 5
xone Filtrare e ripulire stringhe in input PHP 1
K Filtrare per distanza Classic ASP 3
G Filtrare risultati Google Maps PHP 1
S Filtrare casella di riepilogo da query UNION MS Access 0
G Filtrare i risultati per fascia di prezzo WordPress 2
M Filtrare AutoComplete Extender Ajax 1
JellyBelly Passare Parametro per filtrare i maker per google map Javascript 0
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
G Invio di più valori con la stessa checkbox PHP 4
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
C prendere dei valori da Plugin e inserirli nel database joomla Joomla 0
F Stampare valori di un database PHP 14
T Recupero valori tramite $_GET PHP 4
otto9due Inserire o aggiornare tabella my sql controllando una coppia di valori PHP 7
M Problemi con la stampa dei valori in php PHP 1
M Passaggio Valori checbox in textarea Javascript 1
D passare valori da database sql a php PHP 1
O Recupero valori da listato Javascript 0
R Raggruppare valori array PHP 5
R Estrarre valori duplicati più volte PHP 0
T recupero valori select multipla da android Javascript 3
L estrarre valori max tra più tabelle MySQL 2
MarcoGrazia Valori di ritorno json via ajax non visti. jQuery 1
N VENDITA CORSO DROPSHIPPING LUCA VALORI Altri Annunci 0
A Ottenimento valori presenze istantanee MySQL 8
L Estrazione valori max su più campi MySQL 4
G Controllare valori in 2 tabelle PHP 5
X [Select] Valori chiave non presenti in un'altra tabella MySQL 2
G MariaDB non restituisce dei valori PHP 7
M Estrarre valori MAX da un db con una left join MySQL 8
S Istruzione sql valori "simili" PHP 7
C [PHP] Estrarre da una classe i valori che mi interessano PHP 5
S [PHP] Confrontare due array con valori quasi uguali PHP 2
D [PHP] Tabella: modificare direttamente i valori PHP 6
MarcoGrazia [PHP] Unioni di due array con somma di valori PHP 6
B inserire valori da una tabella a un altra mysql PHP 34
M [PHP] Recuperare coppia con valori i valori MAX e coppia con valori MIN PHP 26
Tommy03 [PHP] Media valori presi da una query PHP 3
psicomia Gestione funzione in javascript in tabella richiamare"textarea" valori preimpostati in "select" Javascript 2
G [ASP] Ciclare i valori di 2 array Classic ASP 2

Discussioni simili