PHP - array_search() werkt niet goed
Pagina: « vorige 1 2 3 volgende »
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 -
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!!
Naja je ziet nu wat een quick & dirty je alsnog kost aan tijd :) Tip voor de volgende keer
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 ;)
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.
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)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
function eanExistst($ean)
{
return (strpos('/'.file_get_contents('strings.txt').'/', '/' . $ean. '/') !== false);
}
?>
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?
Ivo P op 12/01/2015 14:29:30:
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:
Toevoeging op 12/01/2015 14:31:57:
en zou een EAN niet doorgaans 13 cijfers lang zijn?
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.
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)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
function eanExistst($ean)
{
return (strpos('/'.file_get_contents('strings.txt').'/', '/' . $ean. '/') !== false);
}
?>
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.
Er zijn ook nog kleinere EAN's zag ik op wikipedia :)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
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";
}
}
$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....
als je zoekt naar "z" in "abc" is het antwoord FALSE
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
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.
871234566711111111/871234566711111112/871234566711111113/871234566711111114/
als je daar zoekt op 871234566711111111 ?
Sowieso: als er inderdaad kortere eans voor kunnen komen, zou ik de / erbij betrekken.
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.
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.
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)
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
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
?>
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
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.
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
comment maak, en ik zet
in de plaats, dan gebruik ik dat hele ARRAY niet (en werkt het ook ineens :))
Code (php)
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)
Ivo P op 12/01/2015 16:10:34:
wat als je op regel 10 zet:
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)
Code (php)
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...
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
Code (php)
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...