WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   PHP - heltal? (https://www.wn.se/forum/showthread.php?t=9602)

bo82 2005-08-30 22:39

Okej säkert någon som kan svara snabbt på denna.

Hur kollar man ifall ett tal är heltal?

Vill göra en for-sats som i varannan loop får man ett värde och i den andra får man ett annat värde.. hm. Förstår?

(ska göra en tabell med varannan rad i en färg och nästa rad i en annan färg)

Oskar Lindgren 2005-08-30 22:56

Använd modulo 2.

typ 0%2 ger 0
typ 1%2 ger 1
typ 2%2 ger 0
typ 3%2 ger 1
osv...

zpD 2005-08-30 22:57

Citat:

Originally posted by bo82@Aug 30 2005, 22:39
Okej säkert någon som kan svara snabbt på denna.

Hur kollar man ifall ett tal är heltal?

Vill göra en for-sats som i varannan loop får man ett värde och i den andra får man ett annat värde.. hm. Förstår?

(ska göra en tabell med varannan rad i en färg och nästa rad i en annan färg)

if($tal%2==1) $farg="#eeeeee";
else $farg="#ffffff";


[edit] jag är alltid för seg ;P [/edit]

nomicon 2005-08-30 22:57

Citat:

Originally posted by bo82@Aug 30 2005, 22:39
Okej säkert någon som kan svara snabbt på denna.
Hur kollar man ifall ett tal är heltal?
Vill göra en for-sats som i varannan loop får man ett värde och i den andra får man ett annat värde.. hm. Förstår?
(ska göra en tabell med varannan rad i en färg och nästa rad i en annan färg)

Typ såhär ungefär:

<?
$y='10';
echo '<table><tr>';
for($x=0;$x<$y;$x++) {
$c++;
$c = $c %2;
if ($c=='1') {
$color='#C1DBB6';
} else {
$color='#A9CE9A';
}
echo '<td bgcolor="'.$color.'">test test test</td>';
}
echo '</tr></table>';
?>

kullervo 2005-08-30 22:59

Det här borde väl fungera?
if($tal == intval($tal))
echo "Heltal";


Edit: Läste inte så noga. Trodde bo82 hade gått ut lågstadiet så han visste vad heltal är förnågot =). Aja, modulo 2 är vägen att gå.

grazzy 2005-08-30 23:02

$color = ($color=='#fff') ? '#aaa' : '#fff';

Svårare än så behöver det inte vara.

Jonas 2005-08-30 23:51

Kod:

<?
if(fmod($x,2)) $c = "black";
else $c = "white";
?>

Skall det vara var 3:dje så ändra 2 till 3 osv

Starweb 2005-08-31 01:41

Citat:

Originally posted by grazzy@Aug 30 2005, 22:02
$color = ($color=='#fff') ? '#aaa' : '#fff';

Svårare än så behöver det inte vara.

Precis så ska det göras!
Enkelt, och gör exakt det den ska göra utan svårigheter.

Jonas 2005-08-31 01:57

Citat:

Ursprungligen postat av Starweb
Citat:

Ursprungligen postat av grazzy
$color = ($color=='#fff') ? '#aaa' : '#fff';

Svårare än så behöver det inte vara.

Precis så ska det göras!
Enkelt, och gör exakt det den ska göra utan svårigheter.

Det gör min kod med ;)

Kan förkortas:
Kod:

<? $c = (fmod($x,2)) ? "black" : "white"; ?>

eg0master 2005-08-31 07:07

Nej jonas, din kod gör inte samma sak som grazzy eftersom du måste räkna upp X någonstans... :P

zpD 2005-08-31 10:43

Citat:

Originally posted by eg0master@Aug 31 2005, 07:07
Nej jonas, din kod gör inte samma sak som grazzy eftersom du måste räkna upp X någonstans... :P
"Vill göra en _for-sats_ som i varannan loop får man ett värde och i den andra får man ett annat värde.."

Jag håller med om att grazzys lösning följer KISS bäst, men räkna upp x gör han ändå i sin for.

jimmie 2005-08-31 11:24

varför använder de flesta modulo? Det är ju endast intressant om man använder en slags radräkning annars:

mindre beräkningar att bara negera det föregående värdet på variabeln med initialt värde på 0 eller. Detta skapar en serie med 0 och 1 omväxlande. Använd sedan värdet på variabeln som villkor till if-satsen.

Grazzys lösning funkar bra, den var snygg tycker jag.

zpD 2005-08-31 11:37

Citat:

Originally posted by jimmie@Aug 31 2005, 11:24
varför använder de flesta modulo? Det är ju endast intressant om man använder en slags radräkning annars:
vad händer med $farg senare i for-satsen?
använder vi den?
vill vi ha fler än 2 olika färger?
gör grazzys förslag att vi behöver komplitera med ytterligare variabler för att hålla $farg oanvänd längre ned i vår for-sats?

tycker vi att modulo är häfigt? :rolleyes:

eg0master 2005-08-31 12:06

Sorry anders att jag inte var med på att X var räknaren i for-loopen (de flesta använder väl i,j,k osv för räknare i for-satser) och/eller att det gällde en ändring av nomicons kod (som ju är ganska pratig). Men jag är inte ledsen för att jag med glimten i ögat gjorde en över-petig kommentar. :P En kommentar som förövrigt antagligen är på sin plats eftersom någon som läser denna tråd kommer testa just bara raden "$c = (fmod($x,2)) ? "black" : "white";" och sedan fråga varför det inte funkar... Det kommer väl ske både med och utan min kommentar iofs...

Nu fortsätter jag med mina petkommentarer;
Jimmie: Läs ditt inlägg igen. "negera det föregående värdet med initialt värde på 0" eftersom -0 = 0 ger detta en talserie på 0,0,0,0,0,0...

Grazzys funkar för att växla mellan två saker, men så snart det blir mer är ju en variante med ngn form av räknare enklare att underhålla i längden...

Och jag antar att man använder modulo just för att man har en räknare (t.ex. ett index för att användas med mysql_result motsv) och då är en separat räknare onödigt, fult och sannolikt i längden otydligt. Bättre då att köra modulo på räknaren.

jimmie 2005-08-31 12:28

Citat:

Ursprungligen postat av AndersE
Citat:

Ursprungligen postat av jimmie
varför använder de flesta modulo? Det är ju endast intressant om man använder en slags radräkning annars:

vad händer med $farg senare i for-satsen?
använder vi den?
vill vi ha fler än 2 olika färger?
gör grazzys förslag att vi behöver komplitera med ytterligare variabler för att hålla $farg oanvänd längre ned i vår for-sats?

tycker vi att modulo är häfigt? :rolleyes:

Fler än 2 färger är ju inte intressant i detta fallet så ... :P


Jag gör så här, dock använder jag inte färger utan använder class på tr istället :

$i = 0;
while(nått villkor) {
if($i) {
$color = 'färg1';
} else {
$color = 'färg2';
}

....

$i = !$i;
}


Negera betyder att man gör NOT, dvs negera en nolla ger 1, så det så :P

eg0master 2005-08-31 13:47

Citat:

Originally posted by jimmie@Aug 31 2005, 12:28
Negera betyder att man gör NOT, dvs negera en nolla ger 1, så det så :P
Och här ser vi hur bra det blir när folk inte gör skillnad på true, false, noll och ett... :rolleyes:
Hade du skrivit "negera variabeln och börja med att sätta värdet som false" hade jag förstått direkt vad du menade. "tal serien" du är ute efter är ju false, true, false... Inte 0,1,0.

Noll och ett är inte samma sak som false och true. noll tolkas (i gammal god C-anda) som false om ett boolskt värde förväntas och false tolkas som noll om ett tal förväntas. Det betyder inte att de är samma sak.

jimmie 2005-08-31 14:14

Citat:

Ursprungligen postat av eg0master
Citat:

Ursprungligen postat av jimmie
Negera betyder att man gör NOT, dvs negera en nolla ger 1, så det så :P

Och här ser vi hur bra det blir när folk inte gör skillnad på true, false, noll och ett... :rolleyes:
Hade du skrivit "negera variabeln och börja med att sätta värdet som false" hade jag förstått direkt vad du menade. "tal serien" du är ute efter är ju false, true, false... Inte 0,1,0.

Noll och ett är inte samma sak som false och true. noll tolkas (i gammal god C-anda) som false om ett boolskt värde förväntas och false tolkas som noll om ett tal förväntas. Det betyder inte att de är samma sak.

I php tolkas 0 som false och 1 som true och kan därmed användas som en BENÄMNING på true och false.

Dessutom betyder inte ordet negera något annorlunda om du gör det på t.ex. 7, !(7) = 0. Negera har inget med att ändra tecken på ett tal att göra.

I riktiga tillämpningar där man använder faktisk hårdvara är 0 och 1 direkt synonymt med true och false, titta bara på en processor hur den behandlar true och false, tvivlar på att den skriver true och false med ascii-tecken i processorn medans den arbetar ;)

Jag kan väl också säga att jag kanske skulle ha varit tydligare att jag menade boolskt värde men jag är så van med att arbeta med 1:or och 0:or att jag inte tänkte på det.

Peace :P

eg0master 2005-08-31 15:21

Hahaha, dagen har alltså kommit när jag skall bli uppläxad i hur en dator fungerar internt. Du kan bespara dig den tiden.
Att du väljer att arbeta med "ettor och nollor" (antar att du syftar på detta istf true/false) och inte true/false säger en hel del om dig som programmerare. Jag tänker undvika fadäsen att läxa upp dig i saker du redan kan.
Det är inte häftigt att vara otydlig eller att strunta i en abstraktion när man programmerar.

Vilken av följande rader tycker du själv ger dig mest information om variabeln och dess värde?
Kod:

$a=0;
$a=false;
$oddRow = 0;
$oddRow = false;
$rowType = ODD_ROW;

Vilken rad skulle du använda (idag) och vilken skulle du vilja se om någon annan skrivit koden?

jimmie 2005-08-31 15:42

Citat:

Originally posted by eg0master@Aug 31 2005, 14:21
Hahaha, dagen har alltså kommit när jag skall bli uppläxad i hur en dator fungerar internt. Du kan bespara dig den tiden.
Att du väljer att arbeta med "ettor och nollor" (antar att du syftar på detta istf true/false) och inte true/false säger en hel del om dig som programmerare. Jag tänker undvika fadäsen att läxa upp dig i saker du redan kan.
Det är inte häftigt att vara otydlig eller att strunta i en abstraktion när man programmerar.

Vilken av följande rader tycker du själv ger dig mest information om variabeln och dess värde?
Kod:

$a=0;
$a=false;
$oddRow = 0;
$oddRow = false;
$rowType = ODD_ROW;

Vilken rad skulle du använda (idag) och vilken skulle du vilja se om någon annan skrivit koden?

Det ger samma resultat för de operationer jag använder det till. Dock sparar jag mig att skriva 4 bokstäver, vilket verkar vara lite av vad denna tråden går ut på om man tittar på de andra förslagen ;)

http://se2.php.net/manual/en/types.comparisons.php

Och ja, jag borde nog använda true och false för att vara extra tydlig men av vana blev det 0 och 1 istället. Abstraktion är aldrig fel, men om vi tittar på lite andra förslag så är mitt exempel bra mer abstrakt. Du säger men att jag skulle tro att det är coolt att skriva 0 och 1 istället för false och true är väl lite att ta i :P

Och nej, jag försöker inte läxa upp dig i hur en dator fungerar internt, jag är säker på att du är fullt medveten om det. Det verkar i alla fall troligt att du vet det med tanke på den höga nivån du ofta har på dina inlägg här på forumet.

eg0master 2005-08-31 15:59

hehe, ja att det ger samma resultat har jag aldrig påstått... Det här spårade ur i en diskussion om otydligheten i det du skrev som i första hand (för mig) triggades av kontextet där alla andra använde räknare och du växlade över till boolska värden och på den vägen är det.
Och ja, din kodsnutt jimmie är definitivt inte den värsta. Jag vart mörkrädd av bl.a. nomicrons exempel och valde med flit att inte kommentera det från början eftersom jag misstänker att jag skulle prata för döva öron. Nomicrons exempel har riktiga skräckexempel där han använder strängar rakt igenom fast flera av variablerna är tal. $y='10' är inte samma sak som $y=10 även om många verkar tro det... För att inte tala om ursprungsfrågan... Det är ju uppenbart att det han frågar efter är ju en "modulo 2" alt. "boolsk negera" lösning (eller grazzys "hackerlösning" för den ser hackig ut). Och vad har det med frågan "Hur kollar man ifall ett tal är heltal?" jag ryser när det jag ser framför mig är en loop som ser ut som:
for ($i=0; $i<4711; $i+=0.5)
Det skulle minst sagt vara en intressant (och kreativ) lösning på ett inte helt ovanligt programmeringsproblem...

En sak som vi måste ta upp för att få ett avslut i vår diskussion jimmie; vad kallar du följande operation;
a = -a;
Är inte även det att negera a?

nomicon 2005-08-31 16:13

eg0master:
Att min kod är ett skräckexempel struntar jag i, jag är ingen kodare, utan en vänlig själ som svarade på hans fråga :) Han ville helt enkelt ha ett kodexempel, vilket mitt svar löste. Sedan om mitt svar inte var ett snyggt exempel hör isåfall till en helt annan tråd.
Jag tar inte åt mig om folk tycker att jag kodar som en enarmad gorilla med grönstarr, hade han frågat efter ett snyggt exempel så hade jag inte svarat ö.h.t :)

-Martin

jimmie 2005-08-31 16:17

Citat:

Originally posted by eg0master@Aug 31 2005, 14:59
En sak som vi måste ta upp för att få ett avslut i vår diskussion jimmie; vad kallar du följande operation;
a = -a;
Är inte även det att negera a?

Nja, _jag_ skulle inte kalla det för att negera a. Ordet negera i sig betyder ungefär ta fram motsatsen och man kan i och för sig säga att -a är motsatsen till a. Men i så fall är -0 motsatsen till 0? Kan vi inte överlåta denna diskussion till fil.fak istället? :P

I de sammanhang som jag har hört ordet negera så har det alltid handlat om logik(liggande hockeyklubba ;) ), i matematiken så har jag i alla fall inte använt ordet negera för att beskriva framtagandet av talets motsvarighet med omvänt tecken.

Men, man lär sig något nytt varje dag och det är mycket möjligt att jag har fel och att negera används inom matematiken för att beteckna talet med omvänt tecken.

bo82 2005-08-31 16:51

Hey tack för alla svar :)

Det blev $color = ($color=='#fff') ? '#aaa' : '#fff'; och funkar perfekt ;)

kullervo 2005-08-31 19:56

Var rädd att bo82 skulle bli skrämd av de enormt många och långa svaren på hans korta och simpla fråga att han aldrig skulle röra PHP igen =)

eg0master 2005-08-31 20:21

Citat:

Originally posted by kullervo@Aug 31 2005, 19:56
Var rädd att bo82 skulle bli skrämd av de enormt många och långa svaren på hans korta och simpla fråga att han aldrig skulle röra PHP igen =)
Och det skulle ha varit dåligt? :lol:

eg0master 2005-08-31 20:40

Citat:

Originally posted by nomicon@Aug 31 2005, 16:13
Att min kod är ett skräckexempel struntar jag i, jag är ingen kodare,
Och det vet jag och därför kommenterade jag inte din lösning på samma sätt som Jimmie (där jag egentligen kommmenterade hans otydlighet i hans ursprungssvar) eftersom speciellt en nybörjare, vilket frågeställaren är vad jag kan förstå, skulle missuppfatta vad han (jimmie) menade.

En moderator får väl splitta det här, men det är en intressant tråd i sin helhet. Nu åter till Jimmie... :P
min tolkning av negera i matematik sammanhang är:
Negera, verb för att göra negativt (inte att förväxla med absolut värdet), dvs multiplicera med -1.
Således är det fullt möjligt att "negera" noll eftersom 0*(-1)=0. Men jag ska göra en liten undersökning kring vad mina vänner och kollegor skulle kalla det när man gör a = -a...
To be continued...

bo82 2005-08-31 22:51

Citat:

Originally posted by kullervo@Aug 31 2005, 19:56
Var rädd att bo82 skulle bli skrämd av de enormt många och långa svaren på hans korta och simpla fråga att han aldrig skulle röra PHP igen =)
Ingen risk :) Har faktiskt kodat php ett tag, men glömmer vissa saker och det var ett tag sedan... :/

Skulle vara kul om nån berättade exakt vad
Kod:

$color = ($color=='#fff') ? '#aaa' : '#fff';
gör. tex frågetecknet.

jimmie 2005-08-31 23:21

Det är en kortform av en if-sats

(villkor) ? om sant : om falskt;

grazzy 2005-08-31 23:48

Tertiary expression kallas det för. Syntaxen är

return_value expr(true_expr, false_expr);

Tänk dig att expr är ett uttryck som skall värderas. Det kan värderas till sant eller falskt. Beroende på det värdet så utförs antingen true_expr eller false_expr. Det värde som true_expr eller false_expr blir returnas som värdet av operationen.

Sedan är det en omskrivning som gör att syntaxen är
$return_value = expr ? true_expr : false_expr;
istället för som ett funktionsanrop.

bo82 2005-09-01 00:06

tack jimmie o grazzy.

btw deltag gärna i min omröstning :) (testar lite)

http://www.recycledbytes.net/poll/

eg0master 2005-09-01 06:45

Matematikenkäten pågår:
Så, jag har mailat och frågat ett tiotal av mina bekanta. En salig blandning av system- och datavetare, civilingenjörer i data, matematiker, fysiker och biokemister. Alla minst examen, en handfull doktorander och ett par färdiga doktorer.
Frågan jag ställde var denna:
Citat:

Det handlar om matematik.
a är ett heltal som kan vara både positivt, negativt eller noll.
Frågan är; vad kallas det när jag gör:
a = -a
det vill säga
a = a(-1)

Delresultatet så långt är:
Datavetare (3st): Operationen kallas negera/negation
Matematiker (1st): Operationen kallas invertera

Eftersom jag själv tillhör kategorin datavetare (ej inräknad i resultatet ovan) så verkar det finnas en klar begreppsförvirring. Men jag har ställt följdfrågor till matematikern för att se vad han har för tolkning av ordet "negera". Så denna nagelbitare fortsätter... :P

jimmie 2005-09-01 07:31

Citat:

Originally posted by eg0master@Sep 1 2005, 05:45
Matematikenkäten pågår:
Så, jag har mailat och frågat ett tiotal av mina bekanta. En salig blandning av system- och datavetare, civilingenjörer i data, matematiker, fysiker och biokemister. Alla minst examen, en handfull doktorander och ett par färdiga doktorer.
Frågan jag ställde var denna:
Citat:

Det handlar om matematik.
a är ett heltal som kan vara både positivt, negativt eller noll.
Frågan är; vad kallas det när jag gör:
a = -a
det vill säga
a = a(-1)

Delresultatet så långt är:
Datavetare (3st): Operationen kallas negera/negation
Matematiker (1st): Operationen kallas invertera

Eftersom jag själv tillhör kategorin datavetare (ej inräknad i resultatet ovan) så verkar det finnas en klar begreppsförvirring. Men jag har ställt följdfrågor till matematikern för att se vad han har för tolkning av ordet "negera". Så denna nagelbitare fortsätter... :P

Ska slänga iväg ett mail till en matematikprofessor som jag har bra kontakt med och se vad han tycker.

eg0master 2005-09-01 08:12

Citat:

Originally posted by jimmie@Sep 1 2005, 07:31
Ska slänga iväg ett mail till en matematikprofessor som jag har bra kontakt med och se vad han tycker.
Jag citerar "min" matematikier (som ju inte är professor)
Citat:

Allt beror på vilken mängd vi rör oss i! Är den {sant,falskt} betyder
negera NOT-operatorn. Att säga att man negerar a genom att tilldela
variabeln -1*a går alldeles utmärkt för mig med ;) dvs synonym i vissa
fall...

Man får väl välja mellan att vara alldeles fasligt formell och ange
vilken mängd och vilka operatorer man arbetar med, eller utgår man
bara från att alla fattar vad man menar. Skulle du säga "negera" ett
heltal är det klart att jag fattar. Säger du inverterar, beror det mer
på mängden.

Jag förstår varför man i datavärlden kanske väljer negera framför invertera eftersom invertera lätt skulle kunna förväxlas med bitvis invertering vilket ger ännu ett resultat... Även om det är så att invertera är den korrekta benämningen i domänen heltal.

jimmie 2005-09-01 08:25

Citat:

Ursprungligen postat av eg0master
Citat:

Ursprungligen postat av jimmie
Ska slänga iväg ett mail till en matematikprofessor som jag har bra kontakt med och se vad han tycker.

Jag citerar "min" matematikier (som ju inte är professor)
Citat:

Allt beror på vilken mängd vi rör oss i! Är den {sant,falskt} betyder
negera NOT-operatorn. Att säga att man negerar a genom att tilldela
variabeln -1*a går alldeles utmärkt för mig med ;) dvs synonym i vissa
fall...

Man får väl välja mellan att vara alldeles fasligt formell och ange
vilken mängd och vilka operatorer man arbetar med, eller utgår man
bara från att alla fattar vad man menar. Skulle du säga "negera" ett
heltal är det klart att jag fattar. Säger du inverterar, beror det mer
på mängden.


Jag förstår varför man i datavärlden kanske väljer negera framför invertera eftersom invertera lätt skulle kunna förväxlas med bitvis invertering vilket ger ännu ett resultat... Även om det är så att invertera är den korrekta benämningen i domänen heltal.

Jag kan faktiskt hålla med man fattar ju vad man menar om man säger att man negerar 8 men när man negerar 0 så blir det ju lite förvirring just p.g.a. att man inte vet vad för slags mängd man arbetar med precis som "din" matematiker säger.

Tycker det är lite väl mycket filosofiska funderingar nu, min tekniskt inriktade hjärna får lite spel när man försöker resonera filsofiskt. Det borde vara antingen A eller B ;)

Jag tycker att vi kan säga att när man negerar 7 får man -7.

Tittar man på tallinjen kan man faktiskt försvara användandet då -7 är lika mycket från 0 som 7 fast åt andra hållet, dvs en MOTsats :)

jimmie 2005-09-01 09:11

Jag kan väl också säga att jag nu använder variabeln $odd_row samt rena logiska värden. :) Givetvis bör man vara så abstrakt som möjligt för att skapa en läsbar kod.

eg0master 2005-09-01 11:10

Citat:

Originally posted by jimmie@Sep 1 2005, 09:11
Jag kan väl också säga att jag nu använder variabeln $odd_row samt rena logiska värden. :) Givetvis bör man vara så abstrakt som möjligt för att skapa en läsbar kod.
då är min tid på WN inte bortkastad... ;)


Alla tider är GMT +2. Klockan är nu 22:11.

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