PHP - array_search() werkt niet goed

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Pagina: « vorige 1 2 3 volgende »

- SanThe -

- SanThe -

12/01/2015 13:48:57
Quote Anchor link
De file is ook niet perfect.
In het gevormde array het aantal items:

Leeg => 668
Niet leeg maar ook geen 18 chars => 1
Goed => 6513 (Er zitten 10 dubbelen in)

Totaal 7182
Gewijzigd op 12/01/2015 14:03:05 door - SanThe -
 
PHP hulp

PHP hulp

19/04/2024 16:25:00
 
Sjef dresen

sjef dresen

12/01/2015 14:19:45
Quote Anchor link
Ja oke, dat wist ik.
Het is ook allemaal niet zoals het zijn moet.
E.e.a. kon inderdaad beter in een database en dat soort dingen, maar het is gewoon even quick & dirty gemaakt voor wat tests die niet super belangrijk zijn.

Maar dan nog: hij mag mijns inziens absoluut NIET "gevonden" zeggen terwijl die EAN er überhaupt niet in staat.
Dat zou toch iedereen met me eens moeten zijn? :)

Bedankt trouwens voor de input en het meedenken mensen!!
 
- wes  -

- wes -

12/01/2015 14:21:09
Quote Anchor link
Naja je ziet nu wat een quick & dirty je alsnog kost aan tijd :) Tip voor de volgende keer
 
Sjef dresen

sjef dresen

12/01/2015 14:24:24
Quote Anchor link
Wes is back op 12/01/2015 14:21:09:
Naja je ziet nu wat een quick & dirty je alsnog kost aan tijd :) Tip voor de volgende keer


Je hebt gelijk, het kan beter GOED in één keer.

MAAR: dat wilt niet zeggen dat het een vreemd probleem is wat hier op treed.
Hij vind gewoon een string in een array die er NIET in staat :)

Ben dus ook zéér benieuwd wat hier uit gaat komen...
Want zo heel moeilijk zou dit alles niet moeten zijn, ben er intussen wel al de hele morgen mee bezig ;)
 
Ivo P

Ivo P

12/01/2015 14:29:30
Quote Anchor link
Ozzie PHP op 12/01/2015 13:46:07:
@Ivo

Dit lijkt me ook niet de handigste manier inderdaad. De controle met slashes is dubieus, want afgaande op het voorbeeld hierboven ontbreekt een beginslash. De eerste ean-code zou dus al niet gematched worden. Ga je zonder slashes werken kan je ook problemen ondervinden, aangezien ean 1234 een match zou opleveren met ean 123456.


dan zou ik het aanpassen, zodat er inderdaad altijd een / aan het begin van de data staat. Ofwel in de file, ofwel eraan plakken bij de zoekfunctie.
Idem voor de afsluitende /




Toevoeging op 12/01/2015 14:30:53:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
function eanExistst($ean)
{

  return (strpos('/'.file_get_contents('strings.txt').'/', '/' . $ean. '/') !== false);
}


?>


Toevoeging op 12/01/2015 14:31:57:

en zou een EAN niet doorgaans 13 cijfers lang zijn?
 
Sjef dresen

sjef dresen

12/01/2015 14:33:17
Quote Anchor link
Ivo P op 12/01/2015 14:29:30:
Ozzie PHP op 12/01/2015 13:46:07:
@Ivo

Dit lijkt me ook niet de handigste manier inderdaad. De controle met slashes is dubieus, want afgaande op het voorbeeld hierboven ontbreekt een beginslash. De eerste ean-code zou dus al niet gematched worden. Ga je zonder slashes werken kan je ook problemen ondervinden, aangezien ean 1234 een match zou opleveren met ean 123456.


dan zou ik het aanpassen, zodat er inderdaad altijd een / aan het begin van de data staat. Ofwel in de file, ofwel eraan plakken bij de zoekfunctie.
Idem voor de afsluitende /




Toevoeging op 12/01/2015 14:30:53:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
function eanExistst($ean)
{

  return (strpos('/'.file_get_contents('strings.txt').'/', '/' . $ean. '/') !== false);
}


?>


Toevoeging op 12/01/2015 14:31:57:

en zou een EAN niet doorgaans 13 cijfers lang zijn?


Goede tip!

Er zijn ook EAN's die 18 chars. lang zijn :)
Maar 13 is meer "common" idd.
 
Ozzie PHP

Ozzie PHP

12/01/2015 14:37:28
Quote Anchor link
Er zijn ook nog kleinere EAN's zag ik op wikipedia :)
 
Sjef dresen

sjef dresen

12/01/2015 14:44:13
Quote Anchor link
Het werkt trouwens wel goed met onderstaande code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
function EANalBekend($EAN){
 
  $bestand = 'strings.txt';
  $EANSuitBestand = file_get_contents($bestand);

if (strrpos($EANSuitBestand, $EAN) > 0){
    echo "reeds bekend";
  }else{
    echo "nieuwe EAN";
  }
}


Dus er gaat iets mis met dat array, doordat er "iets?" niet klopt, vind hij onterecht die string.
Maar als ik dat hele array gebeuren oversla, en gewoon via strrpos werk, dan werkt het dus :)

Zal ik dat maar gebruiken voorlopig. Blijft érg vreemd natuurlijk dit hele verhaal....
 
Ivo P

Ivo P

12/01/2015 14:54:56
Quote Anchor link
let erop dat als je zoekt naar "a" in "abc" het antwoord 0 is.

als je zoekt naar "z" in "abc" is het antwoord FALSE
 
Sjef dresen

sjef dresen

12/01/2015 15:04:01
Quote Anchor link
Ivo P op 12/01/2015 14:54:56:
let erop dat als je zoekt naar "a" in "abc" het antwoord 0 is.

als je zoekt naar "z" in "abc" is het antwoord FALSE


Das een goeie!

Maar wat zou dat betekenen voor mijn functie?
Ik hoef alleen maar te weten of die EAN wel of niet voorkomt.

Als hij er NIET in voorkomt, dan geeft die test toch de juiste uitkomst?
Als hij er WEL in voorkomt, dan is de uitkomst inderdaad > 0, dus dan komt er ook het juist uit. Ik heb het met meerdere malen getest, en het werkt keer op keer.
 
Ivo P

Ivo P

12/01/2015 15:09:22
Quote Anchor link
ook als het de eerste is?

871234566711111111/871234566711111112/871234566711111113/871234566711111114/

als je daar zoekt op 871234566711111111 ?

Sowieso: als er inderdaad kortere eans voor kunnen komen, zou ik de / erbij betrekken.
 
- SanThe -

- SanThe -

12/01/2015 15:18:40
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
if(strrpos($EANSuitBestand, $EAN) === false)
{

    echo "nieuwe EAN";
}

else
{
    echo "reeds bekend";
}

?>
 
Sjef dresen

sjef dresen

12/01/2015 15:23:57
Quote Anchor link
Thanks!
Dat zal inderdaad zeker werken.

Maar toch wel _EXTREEM_ vreemd dat het niet werkt (nog steeds niet dus!) met die code die ik voorheen had. En niet bij alle EAN's, maar bij een enkele zo lijkt het!

Die in_array() functie vind gewoon dingen die er niet zijn?! Dat is toch van de gekke?
Zowel op mijn testserver als op de online-server.
 
Ward van der Put
Moderator

Ward van der Put

12/01/2015 15:24:58
Quote Anchor link
Wat langere barcodes betreft: toch even goed opletten wat je nu precies aan het vergelijken bent.
Bij een UPC kan de prijs worden toegevoegd met 5 cijfers in het tweede gedeelte van de barcode. Bij een prijswijziging lijken de gewijzigde laatste cijfers dan te duiden op een nieuw product terwijl het product misschien al voorkomt in je bestand.

Van een UPC van 12 cijfers kun je een EAN van 13 cijfers maken door er een 0 voor te zetten. (Niet elke barcodescanner slikt dat, maar het mag.) Plak je daaraan 5 cijfers van de prijs, dan kom je op een EAN van 18 cijfers (of soms wellicht 17).

Misschien verstandig dus om het geheel wat strakker te formaliseren en controleren, bijvoorbeeld met een database.
 
Sjef dresen

sjef dresen

12/01/2015 15:29:08
Quote Anchor link
Ik heb nu onderstaande code.
Als ik daar switch (commentaar aan/uit) tussen die 2 regels die beginnen met

"if (in_array"

en

"if (strrpos"

dan krijg ik gewoon 2 verschillende outputs.
Waarbij die met strrpos dus WEL correct is, en die met in_array NIET....?!


Dat is toch klinkklare waanzin? Ik kan dat écht niet begrijpen zoiets.


Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

function EANalBekend($EAN){

  $ean_klant = $EAN;
  $bestand = 'strings.txt';
  $EANSuitBestand = file_get_contents($bestand);
  $EANSlos = explode("/", $EANSuitBestand);

  //var_dump($EANSlos);


  if (in_array($ean_klant, $EANSlos)) {

  //if (strrpos($EANSuitBestand, $ean_klant) > 0){

    echo "reeds bekend";
  }
else{
    echo "nieuwe EAN";
  }

}

          
              
  EANalBekend("871694840005xxxxxx"); //even niet de echte EAN online


?>



@ Ward van der Put: thanks! Maar ik gebruik echt alleen 18-chars lange EAN's.
Gewijzigd op 12/01/2015 15:34:28 door sjef dresen
 
Ozzie PHP

Ozzie PHP

12/01/2015 15:52:41
Quote Anchor link
In_array heeft betrekking op een ARRAY en strrpos (vanwaar trouwens reversed?) heeft betrekking op een STRING. Dat zijn 2 verschillende dingen. Jouw input is altijd een ARRAY.
 
Sjef dresen

sjef dresen

12/01/2015 16:07:54
Quote Anchor link
Ozzie PHP op 12/01/2015 15:52:41:
In_array heeft betrekking op een ARRAY en strrpos (vanwaar trouwens reversed?) heeft betrekking op een STRING. Dat zijn 2 verschillende dingen.


Dat snap ik.
Waarom reversed inderdaad... Denk typefoutje of te snel met kopieren van de eerste de beste functie die ik tegen kwam. strpos is logischer inderdaad! Thanks

Quote:
Jouw input is altijd een ARRAY.


Nee, niet altijd toch?
Als ik de regel

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if (in_array($ean_klant, $EANSlos)) {


comment maak, en ik zet

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if (strpos($EANSuitBestand, $ean_klant) > 0){


in de plaats, dan gebruik ik dat hele ARRAY niet (en werkt het ook ineens :))
 
Ivo P

Ivo P

12/01/2015 16:10:34
Quote Anchor link
wat als je op regel 10 zet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
    echo 'regel: ' . __LINE__ . ' in file ' . __FILE__;
    printf('<pre>%s</pre>', print_r($EANSlos, 1));
?>


wat geeft dat voor output?

en dan met name zou het nog leuk zijn om ook in je scherm even te zoeken op de ean die er ten onrechte in voor zou komen. (ctrl-F)
 
Sjef dresen

sjef dresen

12/01/2015 16:14:36
Quote Anchor link
Ivo P op 12/01/2015 16:10:34:
wat als je op regel 10 zet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
    echo 'regel: ' . __LINE__ . ' in file ' . __FILE__;
    printf('<pre>%s</pre>', print_r($EANSlos, 1));
?>


wat geeft dat voor output?

en dan met name zou het nog leuk zijn om ook in je scherm even te zoeken op de ean die er ten onrechte in voor zou komen. (ctrl-F)


Dan komen alle EAN's netjes onder elkaar.
En diegene die ik zoek staat er NIET bij (ik ctrl-F me al de hele dag kapot opzoek naar die EAN haha)

En toch komt de melding "reeds bekend".

Echt niet te filmen he?!

Edit:


Wel staat er in die lijst met EAN's een EAN die LIJKT op diegene wat ik zoek. Alleen daar komen de laatste 2 cijfers niet overeen...


[edit2]

En als ik die erop lijkende EAN weghaal uit strings.txt dan gaat het ook met de "in_array()" methode goed :-)

Dus het lijkt wel alsof die alleen op de eerste 16 characters test, en de laatste 2 laat voor wat het is...
Gewijzigd op 12/01/2015 16:22:55 door sjef dresen
 
Ivo P

Ivo P

12/01/2015 16:25:04
Quote Anchor link
wat als:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php

if ($key = in_array($ean_klant, $EANSlos)) {

  echo 'gevonden in element: '. $key . '<br>';
  echo '#' . $EANSlos[$key] . '#';

}

?>


die ## staan er om te kunnen zien of er iets is met spaties etc.


Toevoeging op 12/01/2015 16:26:34:

-----
wat is de max size van een INT?

een EAN bestaat wel uit cijfers, maar is geen int...
 

Pagina: « vorige 1 2 3 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.