Domanda

Ho i seguenti dati:

a  , b , c   , d                 , e  , f
375, 52, 1892, http://example.com, ::1, 1308233412
341, 52, 1892, http://example.com, ::1, 1308233412
422, 52, 1892, http://example.com, ::1, 1308233417
478, 50, 1892, http://example.com, ::1, 1308233418
58, 481, 1892, http://example.com, ::1, 1308233432
69, 481, 1892, http://example.com, ::1, 1308233432
487, 49, 1892, http://example.com, ::1, 1308233432
  • a = posizione y
  • B = posizione x
  • C = risoluzione dello schermo (browser)
  • d = host
  • E = IP
  • f = timestamp

Cosa voglio fare è, ad esempio:

Controlla se in una casella 50x50px se è così conta +1.

Quindi avrei un tavolo come:

y/x |  0 | 50  | 100  | 150
----+----+-----+------+----
50  | 0  |  1  |   2  |   0
100 | 0  |  0  |   1  |   0
150 | 1  |  0  |   0  |   1
200 | 2  |  2  |   3  |   0
etc.

Sperando che qualcuno possa aiutarmi a raggiungere questo obiettivo sopra

Se segue il link è la creazione di una mappa di calore, http://www.design-code.nl/example/heatmap.php , ma la mappa di calore si sovrappone, quindi voglio mettere i punti verdi in un array che viene conteggiato e quelle aree in cui si trova entro 50x50 si metteranno in evidenza con un altro colore. Ci scusiamo per le scarse informazioni

È stato utile?

Soluzione

Mentre questa domanda è scarsamente formulata, penso di capire cosa stai chiedendo. Ecco cosa dovresti fare. Non sono così fluente in PHP, quindi assicurati di guardare i frammenti di codice che scrivo invece di copiarli/incollarli.

  1. Trova i valori X e Y massimi.
  2. Istanziare e inizializzare un array 2D in base a quei valori divisi per 50.

Ad esempio, se lo desideri Array[X][Y] faresti:

$myArray = array();
for ($x = 0; $x < $maxX / 50; $x++) {
    $myArray[] = array();
    for ($y = 0; $y < $maxY / 50; $y++) {
        $myArray[$x][] = 0;
    }
}

Questo dovrebbe istanziare e inizializzare un array 2D a tutti gli 0 proprio come hai bisogno

3) iterare attraverso il tuo array e per ogni voce, incrementare il valore di $myArray[$curX/50][$curY/50] di 1:

foreach ($inputArray as $curRow) $myArray[$curRow[b]/50][$curRow[a]/50] += 1;

Ancora una volta, non sono un professionista di PHP e ho appena iniziato a lavorarci, ma questo dovrebbe essere un buon inizio.

Altri suggerimenti

Ok, penso di aver capito di cosa tratta la domanda (vedi il mio commento dalla domanda sopra).

Il modo in cui lo farei è dividere le posizioni X e Y per 50 e usare il floor() funzione per ottenere un valore intero da quello. Questo sarebbe il numero della scatola in cui si troverebbero.

Puoi quindi popolarlo in un array abbastanza facilmente.

Il seguente codice produrrà l'array di cui hai bisogno:

$map = array();
foreach($data as $row) {
    $map[floor($row['x']/50)][floor($row['y']/50)]++;
}

Quindi puoi semplicemente stamparlo in una tabella (con le intestazioni di riga e colonna che sono il numero di cella moltiplicato per 50).

Potresti voler zero riempire il $map Array in anticipo in modo da ottenere zeri nelle celle in cui non hai colpi, oppure puoi risolverlo quando lo stampa; sta a te)

Le coordinate della scatola sarebbero:

$x_coor = floor ($a / 50);
$y_coor = floor ($b / 50);

Con le coordinate puoi pieni di un array n-dimensionale

Vuoi cercare una curva di riempimento dello spazio. Un SFC viene solitamente utilizzato per mappe di calore e riduce la complessità 2D a una complessità 1D. Vuoi cercare il blog di Nick Hilbert Curve Spatial Quadtree.

Innanzitutto, devi riempire un array pieno di 0:

$result = array();
for($i=0;$i<2000;$i+=50){
    $result[$i] = array();
    for($j=0;$j<2000;$j+=50){
        $result[$i][$j] = 0;
    }
}

dove il 2000 è la larghezza/altezza massima dello schermo. Quindi, conti i tuoi valori, dove $a è il tuo array:

foreach($a as $v){
    $result[floor($v[0]/50)*50][floor($v[1]/50)*50]++;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top