Kom ihåg mig?
Home Menu

Menu


PHP: ta reda på vilka bokstäver som är versaler

 
Ämnesverktyg Visningsalternativ
Oläst 2008-01-10, 22:00 #1
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
Jag har ett ord där en del bokstäver är gemena och en del versaler. På detta sätt

$word = "CocaCola";

eller

$word = "iPhone";

Nu behöver jag en lista över vilka bokstäver i ordet som är versaler. Resultatet kan exempelvis vara en array med ettor och nollor, där noll betyder gemen-bokstav och ett betyder versal-bokstav. Alla tecken som inte är bokstäver skall vara noll. Det skall även fungera för å, ä och ö.

I exempet ovan skulle CocaCola alltså ge en array (1, 0, 0, 0, 1, 0, 0, 0) och iPhone skulle bli (0, 1, 0, 0, 0, 0).

Är det någon som vet hur man gör detta i PHP? Jag antar att man först måste dela upp ordet i bokstäver. Tyvärr är jag inte så kunnig på PHP.

Tacksam för tips.
radioaktivitet är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-10, 22:48 #2
Lumax Lumax är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 610
Lumax Lumax är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 610
Kod:
<?php
$word = "CocaCola";
$letters = str_split($word, 1);

foreach($letters as $letter){
  if (ctype_upper($letter)) {
   $output[] = 1;
  } else {
   $output[] = 0;
  }
}

print_r($output);
?>
Edit: Lägg till raden setlocale(LC_ALL, 'sv_SE'); överst om du har problem med åäö.
Lumax är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-10, 23:30 #3
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
Tack! Det fungerar perfekt!

Nu har jag tänkt att lagra själva arrayen i en databas. För att spara plats så funderar jag på att lagra det som en bitmask. Problemet är att jag aldrig jobbat med bitmaskar förut.

Orden överstiger aldrig 30 tecken. Så jag borde nog inte behöva mer än en eller två bytes för lagringen...

CocaCola borde få masken 10001000 och iPhone 010000. Men hur gör jag för att göra om arrayen till bytes?
radioaktivitet är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-10, 23:33 #4
Lumax Lumax är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 610
Lumax Lumax är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 610
serialize() och unserialize()
Lumax är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-10, 23:53 #5
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
Det verkar som om serialize genererar en sträng som bara kan användas av php.

Om man istället använder en bitmask behövs nog bara en byte, eller max två, för att lagra informationen. Bitmaskar skall tydligen gå väldigt snabbt att arbeta mot.

Jag tror att man först måste ta varje position för ettorna och addera dem med varandra. iPhone har en versal på position 2. Det blir alltså binären 10, och det kan jag lagra som integer 2. CocaCola har versal på postion 1 och 5. Det blir alltså binären 1 + binären 10000 vilket blir 10001 vilket jag kan lagra som integer 33.

Ovanstående värden får jag från Kalkylatorn i Windows men jag har ingen aning om hur man gör det i php.

edit: jag tänkte fel, nu skall det vara rätt
radioaktivitet är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-11, 00:11 #6
Lumax Lumax är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 610
Lumax Lumax är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 610
Så om du får fram värdet 010000 för ordet "iPhone" så är du alltså inte intresserad av att kunna plocka fram det värdet ur databasen igen?
Om du strippar bort alla nollor på slutet så att du får 10 som binärtal och gör om det till decimaltalet 2 så kommer du ju aldrig kunna läsa ut det ursprungliga värdet från databasen. Dessutom skulle du ju få samma värde för ordet iSnödrivan.
Lumax är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-11, 06:53 #7
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
Det är klart att jag kan få tillbaks värdet. Det är det som är tanken. Ordet kommer jag så klart också att lagra (enligt mina beräkningar räknat man sparar plats genom att lagra alla bokstäver som gemena och binärt).

Det enda jag har kvar att lösa är hur man räknar ut att ordet "iPhone", dvs en versal på position 2 blir binären 10. Och att ordet "USA", dvs en versal på position 1, 2 och 3 blir binären 111 (1 + 10 + 100).

Ja, andra ord kan få samma värden.
radioaktivitet är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-11, 09:42 #8
Lumax Lumax är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 610
Lumax Lumax är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 610
För att du ska kunna lagra decimalvärde som en integer så måste du veta längden på binärtalet. T.ex. så blir både 010 och 0010 talet 2 när du gör om det till ett decimaltal.

Det du kan göra då är att du alltid lägger till en etta först så att du får 1010 och lagrar då decimaltalet 10. Sedan får du alltid maska bort första biten när du läser ut binärtalet.

Att lagra värdet som ett decimaltal är dock en ganska dålig modell eftersom du inte klarar speciellt långa strängar om du lagrar det som en 32-bitars integer.
För enkla ord skulle det dock fungera. Personligen så hade jag föredragit att lagra det som bit-fält i mysql, alternativt som en enkel sträng.
Lumax är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-11, 10:44 #9
Lumax Lumax är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 610
Lumax Lumax är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 610
I övrigt känns det som att du borde tänka om kring din "optimering".
Jag har svårt att tro att du skulle spara någon plats på att spara alla bokstäver som gemener och sedan har en bitmask som talar om vilka som ska vara stora.

Till att börja med så kommer versaler före gemener i ascii-tabellen och har alltså lägre ascii-värde än gemener, desamma gäller för unicode. Dessutom utgår jag från att databasmotorn internt har någon form av optimering/komprimering.

För att kunna lagra ord upp till 32 tecken så behöver du lagra masken för gemener/versaler som en 32-bitars integer. Det innebär att det går åt fyra byte enbart för masken, även fast ordet består av endast två bokstäver.

Slutsats: Skit i att göra om masken till ett decimaltal och lagra den i ett bit-fält istället.
Sedan bör du nog fundera om du inte ska spara allt som versaler istället?

Personligen skulle jag lagra bokstäverna (både gemener och versaler) som en varchar och förlita mig på att databasen sköter lagringen på det mest optimala sättet.
Lumax är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-11, 12:56 #10
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
Du har nog rätt i allt du säger. Men det viktiga för mig är att jag får själva masken lagrad som jag skrev ovan. Jag behöver snabbt kunna få reda på vilka bokstäver som är stora, utan att göra beräkningar. Och då verkar en bitmask vara det bästa sättet. Oavsett hur jag lagrar orden.
radioaktivitet är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 18:25.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017