[PHP] Getal niet opvangen?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 15:55
hey mensen,

Ik zit nu al een tijd te kloten, maar kom er niet achter. Weet ook niet de juiste codes om op te zoeken dus daarom vraag ik het hier maar.
Ik open een CSV bestand met file($file)
Alles werkt gewoon naar behoren, maar ik kan de variabele van de titel niet opvangen.
Het stukje script ziet er zo uit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$i = 0;

$numheaders = count($headers);

while($i <= $numheaders)
        {
            $headers = str_replace("\"", "", $headers);
            echo "<td bgcolor='#d3dce3' width='".$subwidthtable."'><b><font face='arial' size='2'>".$headers[$i]."</font></b></td>";
                if($headers[$i] == "Prijs")
                    $Prijsincl = $i;
                if($headers[$i] == "Leverancier")
                    $LeverancierNR = $i;
                if($headers[$i] == "Productgroep")
                    $Productgroep = $i;
                if($headers[$i] == "Artikelomschrijving")
                    $test = $i;
            $i++;
        }

Het script werkt ok.
Ik haal de titels op met $headers en laat deze doortellen totdat er niets meer is, als een titel dan de uitkomst geef zoals in de if constructie is aangegeven wil ik hem dat nummer toewijzen. Dit veranderd elke keer bij een ander bestand.
Ik weet dat $headers[5] als uitkomst geeft Artikelomschrijving.
Als ik
PHP:
1
echo $headers[5];

doe krijg ik ook gewoon Artikelomschrijving te zien.
Maar als ik die if constructie gebruik hierboven krijgt $test niet de waarde 5. Ik kom er niet uit, iemand anders een idee of een andere optie?
Ben niet zo heel goed in PHP dus vandaar :)

Thnx

[ Voor 28% gewijzigd door ID-College op 25-01-2006 22:41 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

PHP:
1
while($i<$numheaders)

moet waarschijnlijk
PHP:
1
while($i <= $numheaders)

worden. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • HyperioN
  • Registratie: April 2003
  • Laatst online: 24-05 15:42
PHP:
1
while($i <= $numheaders)
Denk ik..

Overigens is dit een leuk voorbeeldje waar je prima een switch-statement voor kunt gebruiken :)

/edit: wat ben ik weer traag zeg..

[ Voor 14% gewijzigd door HyperioN op 25-01-2006 22:19 ]


Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 15:55
-NMe- schreef op woensdag 25 januari 2006 @ 22:17:
PHP:
1
while($i<$numheaders)

moet waarschijnlijk
PHP:
1
while($i <= $numheaders)

worden. :)
Ja had idd gekunt, maar dat had ik al geprobeerd, maar dat mocht helaas niet baten.
Vergeten te melden in startpost :)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Geef eens de uitvoer van print_r($headers) dan?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 15:55
-NMe- schreef op woensdag 25 januari 2006 @ 22:24:
Geef eens de uitvoer van print_r($headers) dan?
Dat geeft:
code:
1
Array ( [0] => Leverancier [1] => Productgroep [2] => Art.nr. [3] => Vendorcode [4] => Prijs [5] => Artikelomschrijving )

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

In dat geval zou bovenstaande code, met de wijziging die HyperioN. en ik aandragen, gewoon moeten werken. Weet je zeker dat het niet ergens anders fout gaat?

Doe na de while (welke beter een for had kunnen zijn) eens var_dump($test)?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Plaats eens : echo "$i\r\n" voor de regel met $i++; en geef dan eens de complete output van je bestand.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • Xenon
  • Registratie: Januari 2001
  • Laatst online: 21-08 09:12
best eerst $i op 0 initialiseren?
en door de laatste $i++ gaat $i altijd 6 op het einde zijn...

[ Voor 49% gewijzigd door Xenon op 25-01-2006 22:35 ]

ProtocoLAN.be: De beste LAN van de Maaskant


Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 15:55
Nee, want ik echo $test er gewoon meteen onder, dus daartussenin zit verder geen code.
Een var_dump($test) geeft NULL

Hij geeft hem ook gewoon weer met print_r, dus hoe kan dat dan fout gaan ?

en $i staat op 0, die staat net boven mijn code die hierboven staat, ff bijgevoegd :)

[ Voor 20% gewijzigd door ID-College op 25-01-2006 22:40 ]


Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 15:55
dusty schreef op woensdag 25 januari 2006 @ 22:32:
Plaats eens : echo "$i\r\n" voor de regel met $i++; en geef dan eens de complete output van je bestand.
Dat geeft: 0 1 2 3 4 5 6 :)

Acties:
  • 0 Henk 'm!

  • HyperioN
  • Registratie: April 2003
  • Laatst online: 24-05 15:42
Plaats maar eens wat meer code want hier zit de fout niet in..
Of plaats "Artikelomschrijving" eens op een andere positie in je array.. doet 'ie het dan wel?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Probeer deze anders even, die zou zeker moeten werken:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$numheaders = count($headers);

for ($i = 0; $i < $numheaders; $i++) {
  $headers[$i] = str_replace("\"", "", $headers[$i]);
  echo "<td bgcolor='#d3dce3' width='".$subwidthtable."'><b><font face='arial' size='2'>".$headers[$i]."</font></b></td>";

  switch ($headers[$i]) {
    case "Prijs":
      $Prijsincl = $i;
      break;

    case "Leverancier":
      $LeverancierNR = $i;
      break;

    case "Productgroep":
      $Productgroep = $i;
      break;

    case "Artikelomschrijving":
      $test = $i;
      break;
  }
}

[ Voor 5% gewijzigd door NMe op 26-01-2006 00:39 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

Zet die str_replace eens buiten de loop. Dat lost je probleem niet op, maar is wel beter.

En om je probleem op te lossen, moet je eens trim over je input gooien. Waarschijnlijk is $headers een explode van de eerste regel die je van je aanroep van file terug krijgt, en dan eindigd die met eem new-line. Deze new-line zal dan bij het laatste element van je $headers-array zitten.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

WormLord schreef op donderdag 26 januari 2006 @ 08:44:
Zet die str_replace eens buiten de loop. Dat lost je probleem niet op, maar is wel beter.
Die str_replace moet wel binnen de loop staan. Je kan niet een heel array in één keer doorlopen met str_replace, dat moet element voor element. Het moet echter wel
PHP:
1
$headers[$i] = str_replace("\"", "", $headers[$i]);

zijn, en niet
PHP:
1
$headers = str_replace("\"", "", $headers);

zoals ik het al in mijn stukje code heb veranderd. :P
En om je probleem op te lossen, moet je eens trim over je input gooien. Waarschijnlijk is $headers een explode van de eerste regel die je van je aanroep van file terug krijgt, en dan eindigd die met eem new-line. Deze new-line zal dan bij het laatste element van je $headers-array zitten.
Als het goed is geeft de functie file() geen newlines terug op iedere regel. Trim zou dus niets uit moeten maken, maar je kan het allicht proberen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 15:55
Bedankt voor de replys, kon niet eerder replyen ivm school.
Ik heb vanalles geprobeerd, ook dat stukje van NME plaatste (bedankt daarvoor :)) werkt niet. Ik zal een andere oplossing moeten vinden.
Ik vat er niks van en ga het eens allemaal opnieuw proberen, misschien kom ik er dan uit. Ook zitten er nog wat andere fouten in die nog verbeterd moeten worden.
Mocht ik er niet uikomen dan vraag ik hier wel raad.
Iig bedankt :)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als mijn code hierboven niet werkt, dan zit je fout ergens anders denk ik. Voor zover ik zo kan zien zit er in mijn code namelijk geen fout. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

-NMe- schreef op donderdag 26 januari 2006 @ 14:04:
[...]

Die str_replace moet wel binnen de loop staan. Je kan niet een heel array in één keer doorlopen met str_replace, dat moet element voor element.
Niet volgens php.net:
As of PHP 4.0.5, every parameter in str_replace() can be an array.
-NMe- schreef op donderdag 26 januari 2006 @ 14:04:
Als het goed is geeft de functie file() geen newlines terug op iedere regel. Trim zou dus niets uit moeten maken, maar je kan het allicht proberen.
Van de link die je geeft:
Identical to file_get_contents(), except that file() returns the file in an array. Each element of the array corresponds to a line in the file, with the newline still attached. Upon failure, file() returns FALSE.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Hmm, ik ken de functie al sinds de PHP 3 tijd, vandaar dat ik dat niet wist. My bad. :P
Van de link die je geeft:

[...]
Dan vraag ik me af waarom de rest wel werkt; daar zouden immers ook newlines achter moeten staan dan. :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 15:55
-NMe- schreef op donderdag 26 januari 2006 @ 17:43:
[...]

Hmm, ik ken de functie al sinds de PHP 3 tijd, vandaar dat ik dat niet wist. My bad. :P

[...]

Dan vraag ik me af waarom de rest wel werkt; daar zouden immers ook newlines achter moeten staan dan. :?
Klopt ze werken allemaal, behalve die ene. Als ik hem echo staat er soms een spatie achter. Maar ook dat werkt niet als ik deze toevoeg.
Ook het jokerteken % wil niet werken ipv een eventuele lege plek, ik zou het niet weten. Is er niet iets als LIKE ofzo? Net zoals in sql :)

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Een oplossing daarvoor is substr gebruiken, maar netter is natuurlijk uitzoeken waarom die spatie (soms) erachter komt te staan.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

Misschien is het handig als de TS wat meer code laat zien, zodat we kunnen zien hoe het bestand gelezen word en hoe uiteindelijk $header word gevuld. Ik denk namelijk dat het niet via $header = file($file); is. Maar meer iets als:
PHP:
1
2
$lines = file($file);
$header = explode(",", $lines[0]);

De TS-code komt op mij over als code die uitzoekt in welke kolom bepaalde informatie staat.

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Als je aan die code van NME nou eens een default case zet:
PHP:
1
2
default:
          echo "niet herkend: ;".$headers[$i].";\n";

Dat zou dan op regel 23 komen. Door die puntkomma's zorg je dat je eventuele spaties etc kan zien. Als dat geen duidelijkheid geeft zou je een strcmp kunnen doen, en kijken wat het verschil is.

Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 15:55
Ik geloof dat ik het probleem heb gevonden.
Het toeval is dat het telkens de laatste uit de reeks is.
Als ik het document vervangen door een ander document dan kan ik weer de laatste niet opvangen.
Als ik print_r($headers) doe krijg ik ook de array te zien. Als ik bron weergeven doe zie ik in Firefox het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
(
    [0] => Leverancier
    [1] => Productgroep
    [2] => Subgroep:
    [3] => Artikelomschrijving
    [4] => Prijs
    [5] => Voorraad:
    [6] => Verwachte levertijd
    [7] => image_small
    [8] => image_big

)

Het word waarschijnlijk zo weergezet. En achter de laatste staat dus een newline. Nu heb ik \n erbij al geprobeerd dat wil niet. Zou het kunnen zijn dat hij zelf die enter erachterzet en daarom pakt hij de laatste telkens niet?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Een enter op een Windows-systeem is \r\n, niet alleen \n. Daarnaast moet je die enter wegwerken uit je haystack, niet toevoegen aan je needle. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Daar zijn heel makkelijke functies voor in PHP. Ik zal ze zelfs voor je opzoeken:
Op http://nl2.php.net/manual/en/ref.strings.php staat o.a. http://nl2.php.net/manual/en/function.trim.php genoemd, welke precies doet wat jij wilt.

Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 15:55
-NMe- schreef op maandag 30 januari 2006 @ 21:05:
Een enter op een Windows-systeem is \r\n, niet alleen \n. Daarnaast moet je die enter wegwerken uit je haystack, niet toevoegen aan je needle. ;)
Yes dat is hem.
Hij pakt standaard bij de laatste dus \r\n.
Nu doet hij het wel, bedankt ik wist wel dat ik er uit kwam met jullie O+ :9~ :) :>

Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 15:55
MBV schreef op maandag 30 januari 2006 @ 21:07:
Daar zijn heel makkelijke functies voor in PHP. Ik zal ze zelfs voor je opzoeken:
Op http://nl2.php.net/manual/en/ref.strings.php staat o.a. http://nl2.php.net/manual/en/function.trim.php genoemd, welke precies doet wat jij wilt.
Kijk dat wist ik ook niet.
Zoals in het begin stond weet ik niet superveel van PHP, maar ik leer telkens bij. Bedankt dit heb ik idd nodig, zit weleens vaker met iets wat dus dit probleem was.
Bedankt jongens :> _/-\o_

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

2 tips: als je *iets* zoekt in php, begin dan met www.php.net/*iets*. zoekt een bijpassende functie bij wat je wilt :)
Als dat niet werkt, moet je bij de manual page in het overzicht zoeken naar het soort functie (string, array, ...), klikt op die pagina, en zoekt door de lijst tot je datgene vindt wat je zoekt. Echt megaveel wat er in die taal zit :)

edit:
mag ik heel erg lullig zijn? [rml]WormLord in "[ PHP] Getal niet opvangen?"[/rml]

[ Voor 15% gewijzigd door MBV op 30-01-2006 21:34 ]


Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 15:55
Alleen vat ik niet echt hoe de functie werkt.
ik zat al bij de voorbeelden te kijken alleen snap er niet echt veel van.
Ik heb dus
PHP:
1
2
3
4
5
6
7
     case "Artikelomschrijving":
      $Artikelomschr = $i;
      break;

    case "image_small":
      $image_small = $i;
      break;

maar die trim pakt hij niet.
Het kan natuurlijk ook voorkomen dat Artikelomschrijving als laatste is, en dan komt daar ook /r/n achter. En dat kan ook bij image_small het geval zijn, hoe krijg ik dat werkend, aangezien de laatste telkens anders kan zijn :)

edit:
PHP:
1
2
3
    case trim("image_small"):
      $image_small = $i;
      break;

Die werkt wel, alleen de laatste pakt hij niet, dus als ik
PHP:
1
2
3
    case "image_small/r/n":
      $image_small = $i;
      break;

doe doet hij het wel, wat is hier fout aan?

[ Voor 41% gewijzigd door ID-College op 30-01-2006 21:58 ]


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

je moet in dat switch-statement een trim zetten. Dat is namelijk de variabele waar je mee vergelijkt. Wat jij doet, werkt alleen in het volgende geval:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//switch(trim($var)) //bonus: zo hoort het
switch($var)
{
  case "boe\r\n": 
      //dit wordt aangeroepen zodra $var gelijk is aan "boe\r\n"
      doe_iets(); 
      break;
  case trim("boe\r\n"): 
      //dit wordt aangeroepen zodra $var gelijk is aan trim("boe\r\n")
      //trim("boe\r\n") == "boe"
      doe_iets_anders();
      break;
  default: 
      //direct een tip: een default om onbekenden af te vangen is handig met debuggen
      show_warning("Deze ($var) kende ik nog niet");
      break;
}


Jij maakt een denkfout: éérst wordt trim("label") gedaan, daarna wordt bepaald welke case een match heeft. Je moet dus zorgen dat je variabele anders is, niet dat je label anders is!

[ Voor 18% gewijzigd door MBV op 30-01-2006 22:37 ]


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

offtopic:
* Van mij wel. Vind het wel geinig dat men er 4 dagen over doet om tot dezelfde conclusie te komen als ik ;)


Als je van het vullen van je $header nou eens zoiets maakt:
PHP:
1
2
$lines = file($file);
$header = explode(",", trim($lines[0]));

Je moet trim namelijk per regel aanroepen, en niet per veld. Het mag wel, maar is totaal overbodig.

Acties:
  • 0 Henk 'm!

  • Wim-Bart
  • Registratie: Mei 2004
  • Laatst online: 10-01-2021

Wim-Bart

Zie signature voor een baan.

Je kan ook het volgende doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function BepaalHeader($aHeader, &$aHeaders)
{
  $sReturn= '';
  foreach ($aHeader as $iKey => $sHeader)
  {
     $sHeader= strtolower(trim($sHeader));
     if (isset($aHeaders[$sHeader]))
     {
        $aHeaders[$sHeader]= $iKey;
     }
     else
     {
       $sReturn.= 'Extra sleutel "'.$sHeader.'" gevonden op positie "'.$iKey.'"."\r\n"';
     }
  }
}


Aanroepen met:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$aVelden= array('artikelnr' => -1, 'artikelnaam' => -1, 'aantal'  => -1, 'prijs' => -1);

$sSeperator= ";";                        // ;
// $sSeperator= ",";                     // ,
// $sSeperator= "\t";                    // tab

// Code om bestand te openen
$lines = file($file); 
$header = explode($sSeperator, $lines[0]); // te hopen dat seperator niet in een text veld voorkomt.

$sWaarschuwing= BepaalHeader($header,$aVelden);

if (strlen($sWaarschwing)>0)
{
  echo $sWaarschuwing;
}

foreach ($aVelden as $sKey => $iVeld)
{
  if ($iVeld>-1)
  {
    echo 'Veld "'.$sKey.'" gevonden op positie "'.$iVeld."\r\n";
  }
  else
  {
    echo 'Veld "'.$sKey.'" niet gevonden'."\r\n";
  }
}

[ Voor 44% gewijzigd door Wim-Bart op 31-01-2006 08:31 ]

Beheerders, Consultants, Servicedesk medewerkers. We zoeken het allemaal. Stuur mij een PM voor meer info of kijk hier De mooiste ICT'er van Nederland.


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

die switch-case vind ik logischer, duidelijker wat er gedaan wordt dan bij jouw manier :). Ook makkelijker om gespecialiseerd gedrag later toe te voegen (onderhoudbaar dus)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

ID-College schreef op maandag 30 januari 2006 @ 21:41:
doe doet hij het wel, wat is hier fout aan?
NOFI, maar heb je enig idee wat een switch is? Of wat trim nu precies doet? Heb je de betreffende manualpagina's al eens bekeken? Als je die goed genoeg bekijkt, dan zie je vanzelf dat de code die je nu geschreven hebt gewoon niets uithaalt.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1