Avatar billede gil-galad Nybegynder
05. februar 2011 - 01:58 Der er 9 kommentarer og
1 løsning

Beskære et array

Hej

Jeg har tre arrays:

$new_ar["tid"]
$new_ar["dybde"]
$new_ar["temp"]

De kan indeholde alt fra nogle hundrede keys, til flere tusinde, hver bestående af 2-5 tegn. Jeg vil sende disse til en anden server vha. POST, hvilket begrænser mig til i alt 16000 tegn.

----

Jeg behøver kun at sende ca. 3-400 keys til serveren, hvilket får antallet af tegn under grænsen, men disse keys skal så være lineært repræsentative for den samlede mængde keys. Fx:

Jeg har:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Jeg behøver kun at sende:
1, 3, 5, 7, 9

----

Mit spørgsmål er så, hvordan jeg bedst "piller" de unødvendige keys ud af mine arrays?
Avatar billede showsource Seniormester
05. februar 2011 - 05:09 #1
Du kan vel bruge array_keys($new_ar["tid"]) så du får keys i et nyt array.

Er keys altid fortløbende ?
Avatar billede webweaver Praktikant
05. februar 2011 - 09:02 #2
Alle de keys du ikke skal bruge, bruger du dem et andet sted, siden du i det hele taget har dem i et array?

Ellers kunne man allerede ved oprettelsen af dette array, sørge for kun nødvendige værdier gemmes, i stedet for at slæbe rundt på sådan nogle store arrays...
Avatar billede olsensweb.dk Ekspert
05. februar 2011 - 10:35 #3
#1 og #2
det er muligt jeg tager fejl, men jeg tror det er en forsættelse af http://www.eksperten.dk/spm/930511 hvor showsource importerede csv filen til et array, og dykkertiden så er $new_ar["tid"] er 0 4 8 12 16 ... min, og spørgeren kun vil have over for hver anden dvs 0 8 16 min
Avatar billede olsensweb.dk Ekspert
05. februar 2011 - 11:33 #4
en ide find længden af $new_ar["tid"] lav en tæller med modulus 2, og er et lig = 0, udtræk array pos til et nyt array

en udbygning http://www.eksperten.dk/spm/930511 #4

<?php
$fil = file("test.csv");
// definerer et array på forhånd, med 4 "keys" som hver er endnu et array
$new_ar = array("tid" => array(), "dybde" => array(), "temp" => array(), "co2" => array());

// $i == 1 fordi den første linie ikke indeholder relevant info ?
for($i = 1; $i < count($fil); $i++) {
    $line = trim($fil[$i]);
    if(empty($line)) {
        continue;
    }
    // Del linie op for hvert komma
    $vars = explode(",", $line);
    if(count($vars) >= 4) {
        $new_ar["tid"][] = trim($vars[0]);
        $new_ar["dybde"][] = trim($vars[1]);
        $new_ar["temp"][] = trim($vars[2]);   
        $new_ar["co2"][] = trim($vars[3]);   
    }
}

print_r($new_ar);
[b]
$postarray = array();
$lng = count($new_ar["tid"]);
for($i=0; $i<$lng; $i++){
    if($i%2==0){
        $postarray[] = $new_ar["tid"][$i].",".$new_ar["dybde"][$i].",".$new_ar["temp"][$i];
    }
}
print_r($postarray);
[b]
?>

og så kan jeg regne ud det er selvføgelig sec der står i tid, og ikke min min som jeg fik skrevet ovenover :)
Avatar billede olsensweb.dk Ekspert
05. februar 2011 - 11:35 #5
glemte lig / til b slut :(
print_r($new_ar);

$postarray = array();
$lng = count($new_ar["tid"]);
for($i=0; $i<$lng; $i++){
    if($i%2==0){
        $postarray[] = $new_ar["tid"][$i].",".$new_ar["dybde"][$i].",".$new_ar["temp"][$i];
    }
}
print_r($postarray);
Avatar billede olsensweb.dk Ekspert
05. februar 2011 - 12:05 #6
som webweaver er inde på sortere allerede når du laver arrayet, det er vel det pæneste, med mindre du selvføgelig skal præsenterer alle værdierne på skærmen først
if(count($vars) >= 4) {

if($i%2==0){
        $new_ar["tid"][] = trim($vars[0]);
    $new_ar["dybde"][] = trim($vars[1]);
    $new_ar["temp"][] = trim($vars[2]);   
    $new_ar["co2"][] = trim($vars[3]);   
}

}
ligger kun tiderne 4, 12, 20 i array
Avatar billede gil-galad Nybegynder
06. februar 2011 - 19:07 #7
Jeg skal have tegnet mine data som en graf (google chart api). Denne er ca. 500px bred, så det giver ikke mening at have meget mere end 500 datapunkter.

Jeg ved ikke på forhånd hvor mange datapunkter jeg har i min datafil. Jeg tænker noget i stil med:
- Tæl antal datapunkter
- Regn ud hvor mange datapunkter der skal fjernes således man ender på 500 punkter
- Fjern disse ligeligt i array'sne. (Dette ved jeg ikke hvordan gøres)
Avatar billede olsensweb.dk Ekspert
07. februar 2011 - 14:55 #8
hvis de skal fordeles ligeligt vil du altid få et tab af data fra post 500*divfactor, her er et bud på hvordan det kan laves, den er ikke gennem tested, men tested med 4 data filer
fil 1 = 505 poster =>  divfactor = 1 ->  33 min
fil 2 = 1028 poster => divfactor = 2 ->  68 min
fil 3 = 1714 poster => divfactor = 3 -> 114 min
fil 4 = 2035 poster => divfactor = 4 -> 135 min

<?php
// der laves 15 målinger pr min (1 måling pr 4 sek)

$filname = "test.csv";
// definerer et array på forhånd, med 4 "keys" som hver er endnu et array
$new_ar = array("tid" => array(), "dybde" => array(), "temp" => array(), "co2" => array());
$fil = file($filname);
$maxantalpunkter = 500;
$antal = count($fil); // Tæl antal datapunkter
$antal--; // tæller 1 ned da overskriften ikke skal tælles med som data
$divfactor = 1; // steep mellem datapunkt der skal overføres til $new_ar
// Regn ud hvor mange datapunkter der skal fjernes således man ender på 500 punkter
if($antal > $maxantalpunkter){
    // $divfactor = (int)($antal/$maxantalpunkter); // ligesom floor
    // $divfactor = floor($antal/$maxantalpunkter); // runder ned, for størst opløsning, men nogle af de sidste målinger vil ikke komme med
    // $divfactor = ceil($antal/$maxantalpunkter);  // runder op, så alle målinger kommer med, men på bekostning af opløsning
    $divfactor = round($antal/$maxantalpunkter);    // bedste målinger/opløsning forhold

    /********* Start Nødløsning for at får start tidspunktet med ********/   
    // start tidspunktet (tid 00:00)   
    if($divfactor>2){
        // linje 0 = overskrifter   
        for($i=1; $i<$divfactor;$i++){
            $line = ($fil[$i]);
            if(empty($line)) {
                continue;
            }
            $vars = explode(",", $line);
            // må kun være i denne løkke 1 gang, derfor bryder jeg ud så snart jeg har fundet start kl 00:00
            if(count($vars) >= 4) {               
                $new_ar["tid"][] = $vars[0];
                $new_ar["dybde"][] = $vars[1];
                $new_ar["temp"][] = $vars[2];   
                $new_ar["co2"][] = $vars[3];   
                break;
            }           
        }
    }
    /********* Slut Nødløsning for at får start tidspunktet med ********/       
}

for($i=$divfactor, $j=0; $i<$antal && $j<$maxantalpunkter; $i+=$divfactor, $j++) {
    $line = ($fil[$i]);
    if(empty($line)) {
        continue;
    }
    // Del linie op for hvert komma
    $vars = explode(",", $line);
    if(count($vars) >= 4) {
        $new_ar["tid"][] = $vars[0];
        $new_ar["dybde"][] = $vars[1];
        $new_ar["temp"][] = $vars[2];   
        $new_ar["co2"][] = $vars[3];           
    }
}

//  echo $divfactor;
// echo "array er  ".count ($new_ar["tid"]);
// print_r($new_ar);
?>
Avatar billede gil-galad Nybegynder
08. februar 2011 - 02:22 #9
ronols>> Det virkede helt efter hensigten!

Tak skal du have - smider du et svar?
Avatar billede olsensweb.dk Ekspert
08. februar 2011 - 13:29 #10
det for du her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester