PHP - array_search() werkt niet goed
Om te controleren of een bepaalde string al gebruikt is door het systeem heb ik onderstaande functie gemaakt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
function StrAlBekend($STR){
$str_klant = $STR;
$bestand = 'strings.txt';
$STRSuitBestand = file_get_contents($bestand);
$STRSlos = explode("/", $STRSuitBestand);
if (array_search($str_klant, $STRSlos)){
echo "bekend";
}else{
echo "nieuw";
}
}
$str_klant = $STR;
$bestand = 'strings.txt';
$STRSuitBestand = file_get_contents($bestand);
$STRSlos = explode("/", $STRSuitBestand);
if (array_search($str_klant, $STRSlos)){
echo "bekend";
}else{
echo "nieuw";
}
}
Ik krijg echter (opeens!! het heeft altijd goed gewerkt) vreemde situaties:
Bij een bepaalde string zegt de functie dat de string al bekend is, terwijl dat absoluut niet zo is. De string is NIET te vinden in het bestandje "strings.txt". Niet PRECIES, want de laatste 2 karakters zijn absoluut anders.
Hoe kan het dat het systeem toch denkt deze string te hebben gevonden? En belangrijker; hoe kan ik dat oplossen?
Ik dacht dat de functie array_search() echt wel secuur/strikt was?!
Alvast bedankt voor het meedenken!
Groet,
Sjef
Om welke string gaat het dan, en wat staat er exact in strings.txt?
Ozzie PHP op 12/01/2015 12:00:26:
Om welke string gaat het dan, en wat staat er exact in strings.txt?
Het gaat om (18 karakters lange) EAN codes. In strings.txt staat bijvoorbeeld:
871234566711111111/871234566711111112/871234566711111113/871234566711111114/ etc...
Sjef dresen op 12/01/2015 12:09:03:
In strings.txt staat bijvoorbeeld:
871234566711111111/871234566711111112/871234566711111113/871234566711111114/ etc...
871234566711111111/871234566711111112/871234566711111113/871234566711111114/ etc...
Is dat 1 lange regel zonder enters?
Ja, alles achter elkaar. De strings allemaal met "/" ertussen zodat ik ze makkelijk kan "explode" en vervolgens in de array kan zetten om te zoeken.
Kijk eens welke key die vindt en kijk dan eens wat er in het array staat onder die key.
Kan je even het reële voorbeeld geven hoe je de functie met de string waar het omgaat aanroept?
- SanThe - op 12/01/2015 12:21:54:
Kijk eens welke key die vindt en kijk dan eens wat er in het array staat onder die key.
Dan vind hij iets bij key 7175. (strings.txt is een bestand van 120.000 bytes). De EAN is daar BIJNA hetzelfde, behalve de laatste 2 cijfers verschillen. Er komt dus onterecht een "gevonden" uit...
Ozzie PHP op 12/01/2015 12:23:06:
Kan je even het reële voorbeeld geven hoe je de functie met de string waar het omgaat aanroept?
Ik heb -naar aanleiding van de fouten- vanalles zitten proberen. In eerste instantie gebruikte ik de functie in_array()
Dat ziet er dan zo uit:
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);
if (in_array($ean_klant, $EANSlos)){
echo "true";
return true;
}else{
echo "false";
return false;
}
}
if (EANalBekend("871666640005852919")){
echo "reeds bekend";
}else{
echo "nieuwe EAN";
}
?>
function EANalBekend($EAN){
$ean_klant = $EAN;
$bestand = 'strings.txt';
$EANSuitBestand = file_get_contents($bestand);
$EANSlos = explode("/", $EANSuitBestand);
if (in_array($ean_klant, $EANSlos)){
echo "true";
return true;
}else{
echo "false";
return false;
}
}
if (EANalBekend("871666640005852919")){
echo "reeds bekend";
}else{
echo "nieuwe EAN";
}
?>
Maar door de vreemde situaties die nu optreden ben ik vanalles gaan proberen. Waaronder array_search() zoals in het begin van het topic aangegeven.
En de string die je zocht, was dat toevallig de allereerste string in het bestand?
Ozzie PHP op 12/01/2015 12:35:02:
En de string die je zocht, was dat toevallig de allereerste string in het bestand?
Nee.
Ik zoek (in de ideale situatie) alleen maar strings die er (nog) NIET in staan. En als dat inderdaad zo is (de nieuwe EAN is dus nog NIET bekend in het systeem) DAN pas voeg ik hem toe in het bestand.
En die voorbeeldstring van hierboven (die wat door de functie ONTERECHT wordt gevonden) staat ergens midden in de file. Diegene wat ik zoek staat er nog niet in...
En daar gaat het dus fout. Omdat hij er nog NIET in staat, mag de functie dan ook niet melden dat hij er wel in staat :)
Kan ik dat bestandje ergens downloaden?
- SanThe - op 12/01/2015 12:42:46:
Kan ik dat bestandje ergens downloaden?
Ik heb je een PM gestuurd :)
Dank!
Sjef dresen op 12/01/2015 12:49:04:
Ik heb je een PM gestuurd
Zie PM antwoord.
Verder weer in het topic.
Ozzie PHP op 12/01/2015 12:51:44:
Thanks!
Maar dat lijkt op precies dezelfde code die ik al gebruikt heb he?
En het werkt helaas nog steeds niet...
Als ik jou
$strings = '123/456/789'; // informatie uit strings.txt
vervang door
$bestand = 'strings.txt';
$strings = file_get_contents($bestand);
Dan vind hij weer onterecht een string die er NIET in staat...
if (EANalBekend("871666640005852919")){
Hier geeft ie aan nieuwe EAN
Dit:
$bestand = 'strings.txt';
$strings = file_get_contents($bestand);
Kun je gewoon zo doen:
$strings = file_get_contents('strings.txt');
Wat staat er op je scherm als je dit doet:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
function eanExists($ean)
{
return in_array($ean, explode('/', file_get_contents('strings.txt')));
}
?>
function eanExists($ean)
{
return in_array($ean, explode('/', file_get_contents('strings.txt')));
}
?>
Dat zal het probleem echter niet zijn. Aangezien het voorbeeld '871666640005852919' met 18 cijfers een ongebruikelijke EAN is, zal het probleem eerder in de needle $ean en/of de haystack strings.txt liggen.
Hou ook rekening met de maximale lengte van regels in txt-bestanden, die zijn in combinatie met PHP niet oneindig! Wellicht dat je daarop vast loopt.
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);
}
?>
eventueel zonder de afsluitende / of eventueel helemaal zonder /, want de codes zijn toch steeds evenlang.
waarom is deze manier van opslaan gekozen?
1 per regel is mogelijk flexibeler, om nog maar te zwijgen over een database...
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.