Come conoscere la posizione di numeri in un array escludendo i doppioni

samurai.sette

Utente Attivo
17 Dic 2015
232
6
18
Ciao a tutti.
Come da titolo della discussione, in un codice PHP ho un array contenente molti numeri che si ripetono (vanno da 1 a 12 ma non comincia necessariamente da 1). Ho la necessità di conoscere la posizione di ogni primo numero senza tenere conto dei doppioni.
Faccio un esempio:
PHP:
$array = array(10,10,10,10,10,10,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,8,8,8,8,8,9,9,9,9,9,10,10,10,10,11,11,11,12,12,12,12,12,1,1,1,1.....);
Di questo array devo conoscere la posizione ogni primo numero, quindi la posizione del primo 10, poi la posizione del primo 11, poi la posizione del primo 12, poi la posizione del primo 1 ecc.
Ho trovato la funzione "array_search()" ma riesco ad estrarre soltanto la posizione del primo 10,11,12, ecc. ma non mi tiene conto del fatto che i numeri 10,11,12 successivamente si ripetono.
Come faccio per tutta la serie?
Ciao, grazie mille.
 

macus_adi

Utente Attivo
5 Dic 2017
1.313
88
48
IT/SW
Prova così!
PHP:
$pos=[];

$array = array(10,10,10,10,10,10,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,8,8,8,8,8,9,9,9,9,9,10,10,10,10,11,11,11,12,12,12,12,12,1,1,1,1.....);
foreach($array as $k=>$v)
    (!isset($pos[$v]))?$pos[$v]=$k:null;
Pos contiene nelle chivi il numero trovato, mentre il valore contiene la posizione...
 

samurai.sette

Utente Attivo
17 Dic 2015
232
6
18
Ciao macus_adi, grazie mille per la risposta.
Ho provato il tuo codice ma, purtroppo, funziona in parte. Testandolo ottengo questo risultato:
PHP:
Array
(
    [10] => 0
    [11] => 6
    [12] => 13
    [1] => 22
    [2] => 28
    [3] => 34
    [4] => 39
    [5] => 42
    [6] => 47
    [7] => 53
    [8] => 59
    [9] => 64
)
Da come puoi vedere l'array che si ottiene è corretto ma si ferma a 9 e non continua la serie.
 

macus_adi

Utente Attivo
5 Dic 2017
1.313
88
48
IT/SW
Di questo array devo conoscere la posizione ogni primo numero, quindi la posizione del primo 10, poi la posizione del primo 11, poi la posizione del primo 12, poi la posizione del primo 1 ecc.
Per questa richiesta del primo post, dovrebbe funzionare correttamente.....

Da come puoi vedere l'array che si ottiene è corretto ma si ferma a 9 e non continua la serie.
Non ho capito cosa ti serve allora, chiarisci il concetto perchè da come hai scritto VUOI LA POSIZIONE DI OGNI PRIMO NUMERO, ed il codice fa esattamente questo....
Spigati meglio!
Anche perche:
1). Ho la necessità di conoscere la posizione di ogni primo numero senza tenere conto dei doppioni.
Non è coerente con quanto replicato nel post successivo

Ho trovato la funzione "array_search()" ma riesco ad estrarre soltanto la posizione del primo 10,11,12, ecc. ma non mi tiene conto del fatto che i numeri 10,11,12 successivamente si ripetono.
In che senso? mi faresti l'esempio di output che vorresti?

Intanto prova questo e vedi se sono riuscito a centrare la tua richiesta
PHP:
$array = array(10,10,10,10,10,10,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,
   1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,8,8,8,8,8,
   9,9,9,9,9,10,10,10,10,11,11,11,12,12,12,12,12,1,1,1,1,9,9,9,10,10,10,10,10,11,11,12,12,12,12,12,10,10,10,10,1,1,1);
$posix=[];
foreach ($array as $k=>$v)
   ($k==0)?$posix[$k]=$v:($array[$k-1]!=$v && next($array) && $array[$k+1]==$v)?$posix[$k]=$v:null;

print_r($posix);
Il risultato è il seguente:
Array
(
[0] => 10
[6] => 11
[13] => 12
[22] => 1
[28] => 2
[34] => 3
[39] => 4
[42] => 5
[47] => 6
[53] => 7
[59] => 8
[64] => 9
[69] => 10
[73] => 11
[76] => 12
[81] => 1
[85] => 9
[88] => 10
[93] => 11
[95] => 12
[100] => 10
[104] => 1
)
Dove la chiave rappresenta la posizione !
 
Ultima modifica:

samurai.sette

Utente Attivo
17 Dic 2015
232
6
18
Ciao macus_adi, grazie mille per la risposta.
Innanzitutto voglio scusarmi se nel messaggio di apertura della discussione non sono riuscito a spiegarmi bene.
Detto questo, ho provato il tuo ultimo codice e funziona alla perfezione.
Grazie mille! :)