PHP - array_search() werkt niet goed

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Senior DevOps-ontwikkelaar eIDAS

Functie­omschrijving Burgers en bedrijven veilig en betrouwbaar digitaal toegang geven tot diensten en producten van het ministerie van Economische Zaken en Klimaat. Als senior DevOps-ontwikkelaar bouw je daar letterlijk aan mee. En dat doe je bij DICTU: een van de grootste en meest vooruitstrevende ICT-dienstverleners van de Rijksoverheid. Jij werkt mee aan de doorontwikkeling van eIDAS, dat staat voor Electronic IDentification Authentication and trust Services. Deze koppeling maakt de grensoverschrijdende authenticatie op overheidswebsites binnen de Europese Unie mogelijk. Het ministerie van Economische Zaken en Klimaat heeft één moderne toegangspoort voor zijn diensten en inspecties. Enkele daarvan zijn dankzij eIDAS inmiddels

Bekijk vacature »

Pagina: 1 2 3 volgende »

Sjef dresen

sjef dresen

12/01/2015 11:51:27
Quote Anchor link
Hallo allemaal,

Om te controleren of een bepaalde string al gebruikt is door het systeem heb ik onderstaande functie gemaakt:


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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";
  }
}


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
 
PHP hulp

PHP hulp

20/09/2020 07:32:09
 
Ozzie PHP

Ozzie PHP

12/01/2015 12:00:26
Quote Anchor link
Om welke string gaat het dan, en wat staat er exact in strings.txt?
 
Sjef dresen

sjef dresen

12/01/2015 12:09:03
Quote Anchor link
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...
 
- SanThe -

- SanThe -

12/01/2015 12:14:46
Quote Anchor link
Sjef dresen op 12/01/2015 12:09:03:
In strings.txt staat bijvoorbeeld:
871234566711111111/871234566711111112/871234566711111113/871234566711111114/ etc...


Is dat 1 lange regel zonder enters?
 
Sjef dresen

sjef dresen

12/01/2015 12:16:27
Quote Anchor link
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.
 
- SanThe -

- SanThe -

12/01/2015 12:21:54
Quote Anchor link
Kijk eens welke key die vindt en kijk dan eens wat er in het array staat onder die key.
 
Ozzie PHP

Ozzie PHP

12/01/2015 12:23:06
Quote Anchor link
Kan je even het reële voorbeeld geven hoe je de functie met de string waar het omgaat aanroept?
 
Sjef dresen

sjef dresen

12/01/2015 12:31:24
Quote Anchor link
- 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)
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);

  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.
 
Ozzie PHP

Ozzie PHP

12/01/2015 12:35:02
Quote Anchor link
En de string die je zocht, was dat toevallig de allereerste string in het bestand?
 
Sjef dresen

sjef dresen

12/01/2015 12:38:31
Quote Anchor link
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 :)
 
- SanThe -

- SanThe -

12/01/2015 12:42:46
Quote Anchor link
Kan ik dat bestandje ergens downloaden?
 
Sjef dresen

sjef dresen

12/01/2015 12:49:04
Quote Anchor link
- SanThe - op 12/01/2015 12:42:46:
Kan ik dat bestandje ergens downloaden?


Ik heb je een PM gestuurd :)

Dank!
 
Ozzie PHP

Ozzie PHP

12/01/2015 12:51:44
 
- SanThe -

- SanThe -

12/01/2015 12:56:43
Quote Anchor link
Sjef dresen op 12/01/2015 12:49:04:
Ik heb je een PM gestuurd


Zie PM antwoord.

Verder weer in het topic.
 
Sjef dresen

sjef dresen

12/01/2015 12:58:25
Quote Anchor link
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...
 
- SanThe -

- SanThe -

12/01/2015 13:01:13
Quote Anchor link
Is dit degene die fout gaat?
if (EANalBekend("871666640005852919")){

Hier geeft ie aan nieuwe EAN
 
Ozzie PHP

Ozzie PHP

12/01/2015 13:03:28
Quote Anchor link
Even terzijde ...

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$strings
= file_get_contents('strings.txt');
var_dump($strings);
exit;
?>
 
Ward van der Put
Moderator

Ward van der Put

12/01/2015 13:13:39
Quote Anchor link
Het kan zelfs op één regel ;-)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
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.
 
- wes  -

- wes -

12/01/2015 13:24:36
Quote Anchor link
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.
 
Ivo P

Ivo P

12/01/2015 13:36:23
Quote Anchor link
zou het niet zonder array mogen?

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);
}


?>


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...
 
Ozzie PHP

Ozzie PHP

12/01/2015 13:46:07
Quote Anchor link
@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.
 

Pagina: 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.