Avatar billede larsroan Nybegynder
23. juni 2006 - 17:49 Der er 10 kommentarer og
1 løsning

Problem med array

Jeg har problem med å få overført data frå et array til et andet.  Php-koden nedenfor henter data fra to web-sider i Kina - de 20 siste dagers pris-index for bomuld.  10 index'er på 1. siden og 10 fra den anden.  Med koden nedenfor blir dato og index skrevet ut for hver side som bliver åbnet.  Jeg vil gjerne akkumulere dataene in i to variabler; dato og index-verdi, lagre de i egen fil(xml) for så å skrive dataene ut på skjerm.  Jeg lykkes med å hente index-verdier ( $indexA[] ), men ikke samtidig dato.  Spm. er; hvordan overføre dato og index-verdi in i nyt array? For så å skrive ut slik;
Dato: 2006-6-22 14554
Dato: 2006-6-21 14557
....
Php-koden ligger her; http://home.no.net/laroald/webhente4.php
Og her er koden;
<html>
<head>
<title>Hente ekstern info frå Kina </title>
</head>
<body>
<?php
function get_content($url)  {
  $ch = curl_init();
  curl_setopt ($ch, CURLOPT_URL, $url);
  curl_setopt ($ch, CURLOPT_HEADER, 0);
  ob_start();
  curl_exec ($ch);
  curl_close ($ch);
  $string = ob_get_contents();
  ob_end_clean();
  return $string;   
}
$resultat=array();
for($j=1; $j<3; $j++){
$url="http://www.cncotton.com/price/CNCottonindex_en.asp?page=";
$url=$url.$j;
echo $url;
echo "<hr>";
$content = get_content ($url);
$content = strip_tags($content); //Fjern alle tags
preg_match_all("/([0-9]{4}-[0-9]{1,2}-[0-9]{1,2})[^0-9]*([0-9]+)[^0-9]*([0-9]+)/", $content, $resultat);
    for($i=0; $i<count($resultat[0]); $i++)
{
    $indexA[] = $resultat[2][$i];
    $dato[] = $resultat[1][$i];
    echo "Dato: " . $resultat[1][$i]."  ".$resultat[2][$i] . "<br>";
}}
echo "<BR>";
$opplisting = implode ("<BR>", $indexA);
echo $opplisting;
?>
</body>
</HTML>
Avatar billede larsroan Nybegynder
23. juni 2006 - 17:59 #1
Jeg har uden å lykkes forsøkt med;    $dato[] = $resultat[1][$i];
Men dette er ikke optimalt.  Både dato, $resultat[1] samt index-verdi, $resultat[2] bør vel overføres til et array som er åpent for å bli tillagt nye index-verdier. 
Det endelige målet er å lagre tidligere index-verdier i en xml-fil på egen server.  Når så siden bli åpnet senere skal denne xml-filen først lastes inn, finne siste dato/verdi, hvor på det da kan regnes ut om det er 1,2,3,4... sider (à 10 index'er) som må lastes ned.  Endelig skal det hele presenteres grafisk med Phplot, http://www.sourceforge.net/projects/phplot/ - men inden den tid må optimalt array defineres.
Avatar billede gizmo-gizmo Nybegynder
23. juni 2006 - 18:07 #2
Jeg er ikke helt sikker på hvad problemet er, men jeg ville nok gemme alt data i ét array, på følgende måde:

...
preg_match_all("/(\d{4}-\d\d?-\d\d?)\s*?(\d+)\s*?(\d+)/", $content, $resultat);
for($i=0; $i<count($resultat[0]); $i++)
{
        $opsamling[$resultat[1][$i]] = array(
                  "indexA" => $resultat[2][$i],
                  "indexB" => $resultat[3][$i]
                );
}}

echo "<pre>";
print_r($opsamling);
echo "</pre>";
?>

Så kan du også nemt tjekke om datoen eksisterer i forvejen ved at sige:

if (isset($opsamling[$resultat[1][$i]]))
{
  echo "stop her";
  $j = 9999; //eller hvordan man nu bryder ud af det første for-loop :)
}
Avatar billede gizmo-gizmo Nybegynder
23. juni 2006 - 18:10 #3
Jeg rettede også lige regex'en så den er blevet lidt mere gennemskuelig, det skulle dog have været:
/(\d{4}-\d\d?-\d\d?)\s*(\d+)\s*(\d+)/
(selvom det andet også burde virke ok).
Avatar billede jakobdo Ekspert
23. juni 2006 - 18:22 #4
Jeg har forsøgt med denne kode:

<?php
//http://www.eksperten.dk/spm/717209

$multiArray = array();

for($x = 1; $x <= 2; $x++)
{
    $url = 'http://www.cncotton.com/price/CNCottonindex_en.asp?page=' . $x;
    $content = file_get_contents($url);

    if(preg_match_all('/>(\\d{4}-\\d{1,2}-\\d{1,2}).*?(\\d{5})</s', $content, $match))
    {
        for($i = 0; $i < count($match[0]); $i++)
        {
            if(array_key_exists($match[1][$i], $multiArray))
            {
                $multiArray[$match[1][$i]] += $match[2][$i];
            }
            else
            {
                $multiArray[$match[1][$i]] = $match[2][$i];
            }
        }
    }
}

echo '<pre>';
print_r($multiArray);
echo '</pre>';

?>

Du kan se koden her: http://www.codebreaker.dk/exp/717209.php
Er det sådan du tænker?
Avatar billede gizmo-gizmo Nybegynder
23. juni 2006 - 18:32 #5
Lyder som om vi er ret enige ellers jakobdo :) Men burde den ikke stoppe procesen når den når til en dato der allrede eksisterer? (ellers kan den jo i princippet fortsætte i uendelighed og tilføje de samme værdier til array'et næste gang den kører). Den starter jo på side 1 og kører opad.
Avatar billede larsroan Nybegynder
23. juni 2006 - 18:45 #6
Tak for hjelpen - begge to!
Men hvordan får jeg til utskriften på denne måte:

2006-6-22 14554
2006-6-21 14557
..
Er det  $opsamling[1][1] osv.
Avatar billede gizmo-gizmo Nybegynder
23. juni 2006 - 18:49 #7
Du kan f.eks. udskrive indholdet af arrayet $opsamling sådan her:

foreach($opsamling as $dato => $ar)
{
  echo $dato . " " . $ar['indexA'];
}
Avatar billede gizmo-gizmo Nybegynder
23. juni 2006 - 18:50 #8
(ups.. glemte lige linjeskift)
echo $dato . " " . $ar['indexA'] . "<br/>";
Avatar billede gizmo-gizmo Nybegynder
23. juni 2006 - 18:57 #9
Husk på, at når man tilføjer en ny værdi til et array med:
$mitarray[] = "blah";
så tildeler den selv en nøgle (som bliver 0,1,2,3....), men i mit eksempel har jeg brugt dato'en som nøgle (og i det array har jeg så igen brugt indexA og indexB som nøgler, i stedet for tal).
Avatar billede larsroan Nybegynder
23. juni 2006 - 19:00 #10
Dette var den detaljen jeg var ude efter! 
Tak saa meget -begge to.
Nå gjenstår å få dataene over på xml.  Jeg har en formening om hvordan det kan gjøres.  Skal i løpet av helgen forsøke å "kopiere" en php-fil som gjør mye det samme mod Den Europeiske bank i Brüssel - hente og ajourføre de siste valutakurser.  Her er kobling mod min side som undersøker om dagens dato er "gammel", enten åpner xml lokalt eller laster ned xml i Brussel, presenterer ajour valutakurs på skerm og så lagrer dataene i lokal xml-fil. Se; http://home.no.net/laroald/currency2.php
Avatar billede larsroan Nybegynder
23. juni 2006 - 19:07 #11
Å benytte verdiene som nøgle er helt på grensen for min knowhow angående php.  Uanset, nå har jeg variablene slik jeg vilde.  Thank's  (gizmo, dersom du sender meg en epost pr
textile krøllalfa start og til slutt no - så skal jeg fortelle deg litt mer om mit prosjekt.  hilsen LR
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

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