[PHP] in_array geeft alleen de laatste waarde terug *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • looskuh
  • Registratie: Februari 2000
  • Laatst online: 07-12-2024
Ik kom er niet uit en hoop dat iemand me kan helpen.

Ik wil een lijst van id's uit een database afzetten tegen een lijst van id's uit een bestand. Komt een id uit de database niet voor in het bestand, dan wil ik dat ie niet geprint wordt.

PHP:
1
2
3
4
5
6
7
8
9
10
$sql = "SELECT * FROM movies ORDER BY movieid";
$result = mysql_query($sql);

$filecontents = file("exportlist.txt", );

while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
    if(in_array(strtolower($row['movieid'].".wmv"), $filecontents)){
        echo $row['movieid'].":::".$row['catid'].":::".$row['mtitle'].":::<BR>";
    }
}


exportlist.txt ziet er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
973.wmv
974.wmv
976.wmv
977.wmv
978.wmv
979.wmv
98.wmv
980.wmv
983.wmv
984.wmv
985.wmv
986.wmv
987.wmv
988.wmv
989.wmv
99.wmv
991.wmv
993.wmv

Vreemd genoeg wordt er nu elke keer alleen iets afgedrukt bij de laatste regel. Als ik de array laat zien zit ie hartstikke vol, als ik de database gewoon laat lopen zonder die check werkt het ook allemaal.

Maar gek genoeg wordt er nu dus alleen maar bij 993.wmv gezegd dat er een match is.

Wat is hier aan de hand? Thanks.

Acties:
  • 0 Henk 'm!

  • yamAUchi
  • Registratie: Februari 2000
  • Niet online

yamAUchi

0x5f3759df

Misschien ligt het aan line endings (windows: \n | linux: \r\n), de \r zal achter alle waardes staan (behalve bij de laatste), en dan matched dit dus niet.

[ the server is down, life after student-dorm sucks ]


Acties:
  • 0 Henk 'm!

  • Kippenijzer
  • Registratie: Juni 2001
  • Laatst online: 26-08 09:08

Kippenijzer

McFallafel, nu met paardevlees

in_array checkt enkel of *een* element voorkomt volgens mij, misschien is het een 'halve' optie om bij een match het gematchete element uit de array te poppen, en dan middels een loopje hem verder te doorlopen op de rest van de matches tot in_array geen match meer heeft?

Acties:
  • 0 Henk 'm!

  • gertvdijk
  • Registratie: November 2003
  • Laatst online: 18-09 11:40
Kippenijzer schreef op maandag 16 juni 2008 @ 13:56:
in_array checkt enkel of *een* element voorkomt volgens mij[...]
Dat doet hij toch met z'n while loop? Hij gaat elke rij af van het MySQL resultaat.

Lijkt mij ook een probleempje met whitespace/newline characters. De laatste eindigt natuurlijk niet met een newline char.

Kia e-Niro 2021 64 kWh DynamicPlusLine. See my GitHub and my blog for articles on security and other stuff.


Acties:
  • 0 Henk 'm!

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 20:32
Uit de PHP documentatie bij de file() functie:
Note:
Each line in the resulting array will include the line ending, unless FILE_IGNORE_NEW_LINES is used, so you still need to use rtrim() if you do not want the line ending present.
Oftewel, in je loop kijk je of "973.wmv" gelijk is aan "973.wmv\r\n" ;) Dat evalueert naar false, behalve op de laatste regel. Dus probeer regel 4 eens te vervangen door:
PHP:
1
$filecontents = file("exportlist.txt", FILE_IGNORE_NEW_LINES);

[ Voor 16% gewijzigd door Morax op 16-06-2008 14:08 ]

What do you mean I have no life? I am a gamer, I got millions!


Acties:
  • 0 Henk 'm!

  • gertvdijk
  • Registratie: November 2003
  • Laatst online: 18-09 11:40
Morax schreef op maandag 16 juni 2008 @ 14:07:
Uit de PHP documentatie bij de file() functie:
FILE_IGNORE_NEW_LINES
Wat een logisch (NOT!) gekozen naam zeg voor die optie. Je zou dan toch verwachten dat hij de newlines negeert, niet trimt... 8)7 En het zou op zich ook wel veel logische en meer a la php zijn als deze optie standaard was.

Kia e-Niro 2021 64 kWh DynamicPlusLine. See my GitHub and my blog for articles on security and other stuff.


Acties:
  • 0 Henk 'm!

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 20:32
gertvdijk schreef op maandag 16 juni 2008 @ 14:13:
[...]

Wat een logisch (NOT!) gekozen naam zeg voor die optie. Je zou dan toch verwachten dat hij de newlines negeert, niet trimt... 8)7 En het zou op zich ook wel veel logische en meer a la php zijn als deze optie standaard was.
Hij negeert ze ook:
Do not add newline at the end of each array element
Hij negeert ze, waardoor hij ze niet toevoegd aan het einde van de regel ;)

Dat het niet standaard is, verbaasd mij ook ja.

What do you mean I have no life? I am a gamer, I got millions!


Acties:
  • 0 Henk 'm!

  • gertvdijk
  • Registratie: November 2003
  • Laatst online: 18-09 11:40
Morax schreef op maandag 16 juni 2008 @ 14:16:
Hij negeert ze, waardoor hij ze niet toevoegd aan het einde van de regel ;)
offtopic:
toevoegen? Wie praat er hier over toevoegen? Ze staan toch al in de file? Het is een kwestie van houden of trimmen... Negeren zou betekenen dat hij de file als een lange regel ziet.

Kia e-Niro 2021 64 kWh DynamicPlusLine. See my GitHub and my blog for articles on security and other stuff.


Acties:
  • 0 Henk 'm!

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 20:32
gertvdijk schreef op maandag 16 juni 2008 @ 14:20:
[...]

offtopic:
toevoegen? Wie praat er hier over toevoegen? Ze staan toch al in de file? Het is een kwestie van houden of trimmen... Negeren zou betekenen dat hij de file als een lange regel ziet.
offtopic:
De PHP documentatie heeft het over toevoegen ;) Kijk maar bij het commentaar van de FILE_IGNORE_NEW_LINES flag

What do you mean I have no life? I am a gamer, I got millions!


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Morax schreef op maandag 16 juni 2008 @ 14:16:
[...]


Hij negeert ze ook:

[...]


Hij negeert ze, waardoor hij ze niet toevoegd aan het einde van de regel ;)
Nee, hij negeert ze niet. Hij voegt ze idd niet toe, maar dat is wat anders dan negeren, want feitelijk haalt ie ze er juist af. Als ie ze echt zou negeren dan zouden ze er nog steeds in staan, óf idd al negeren bij het parsen van de regels :)
Dat het niet standaard is, verbaasd mij ook ja.
offtopic:
verbaast ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • looskuh
  • Registratie: Februari 2000
  • Laatst online: 07-12-2024
Thanks voor jullie snelle reacties!

Dat werkt inderdaad beter, maar dan zit ik met een nieuw probleem.

Als ik nu zoek op bijvoorbeeld nummer 86, vindt ie ook 386, 586, etc, omdat "86" natuurlijk ook in die bestandsnamen voorkomt.

Zou ik misschien toch gewoon handmatig bij elke databaseentry door de array heenmoeten? Dan kan ik de \r en de \n ervanafhalen, of tellen die niet als tekens? Is misschien langzaam, maar het hoeft maar een paar keer te gebeuren, dus dat is niet zo'n issue...

[ Voor 8% gewijzigd door looskuh op 16-06-2008 15:29 ]


Acties:
  • 0 Henk 'm!

  • gertvdijk
  • Registratie: November 2003
  • Laatst online: 18-09 11:40
looskuh schreef op maandag 16 juni 2008 @ 15:28:
Als ik nu zoek op bijvoorbeeld nummer 86, vindt ie ook 386, 586, etc, omdat "86" natuurlijk ook in die bestandsnamen voorkomt.
Twee opties: regexp en wat proberen met array_intersect.

Kia e-Niro 2021 64 kWh DynamicPlusLine. See my GitHub and my blog for articles on security and other stuff.


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Maak een arraytje van die nummers in je file, explode dat naar een (ID, ID, ) formaat, en plak dat vast aan je query met een IN (ID, ID, ..)

Lijkt me de meest zinnige oplossing.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Evilbee
  • Registratie: November 2002
  • Laatst online: 19:55
Grijze Vos schreef op maandag 16 juni 2008 @ 15:44:
Maak een arraytje van die nummers in je file, explode dat naar een (ID, ID, ) formaat, en plak dat vast aan je query met een IN (ID, ID, ..)

Lijkt me de meest zinnige oplossing.
En toen had je opeens 10000 nummers in je file staan. Dan krijg je dus mooi problemen met de grootte van je query.

LinkedIn - Collega worden?


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Evilbee schreef op maandag 16 juni 2008 @ 16:02:
[...]

En toen had je opeens 10000 nummers in je file staan. Dan krijg je dus mooi problemen met de grootte van je query.
En anders in je resultaat. Als het goed is staan er altijd minder nummers in de textfile dan in de tabel.

Acties:
  • 0 Henk 'm!

  • looskuh
  • Registratie: Februari 2000
  • Laatst online: 07-12-2024
Ik heb het nu inderdaad maar gedaan met een string en een delimiter, waardoor ik check op het voorkomen van "|".$id."|". En dat werkt. Toch jammer dat er altijd gezeur is met newlines....

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

Is het niet handiger om een tabel i.p.v. een file te gebruiken voor welke ID's geexporteerd moeten worden? Dan kan je met 1 query alle geldige movies pakken die geexporteerd mogen worden m.b.v. een INNER JOIN.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1