PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variable ändert sich von selber oder ich sehr doof


allapow
08.02.2008, 20:01:29
hallo Forum, ich brauche eure Hilfe bei einer Sache wo ich nun tagelang dran sitze.

Ich habe eine Zahl, bei der ich fest stellen möchte ob da zwei Nullen vorne dran sind und die dann abschneiden. Eigendlich sollte das ganz einfach sein, dachte ich. Aber php wandelt wie von Geisterhand die gegebene Variable einfach um... kaum hab ich die Variable deklariert, lasse ich sie ausgeben und es ist eine andere.

Ich hab das bei mir auf Ubuntu und bei meinem Provider getestet, beide male kommt das selbe Ergebnis.

Was mache ich falsch?
Mache ich was falsch?

$dest = 0233193;
echo "Nummer: ".$dest."<br>";
$form1 = strpos($dest, '0');
if ($form1 = 0){
$sub1 = substr($dest, 1);
}
if($sub1){
$form2 = strpos($sub1, '0');
}

if ($form2 = 0){
$sub2 = substr($sub1, 1);
}
//-----------------
echo "Nummer: ".$dest."<br>";
echo "erster Substring: ".$sub1."<br>";
echo "zweiter Substring: ".$sub2." ";


Ausgabe ist:
Nummer: 1241
Nummer: 1241
erster Substring:
zweiter Substring:

Chance
08.02.2008, 20:45:31
Nicht von Geisterhand... its not a bug, its a funtion .

PHP wandelt die variable nur automatisch in eine Zahlenvariable um, wenn eine Zahl zugewiesen wird.

So gesehn vergleichst du Äüpfel mit Birnen.

allapow
08.02.2008, 20:46:53
ok, es liegt wohl an der Null am Anfang, denn ohne '0' "spinnt" nichts.
Aber die Zahlen, die ich bearbeiten möchte, haben meistens eine Null am Anfang, was kann ich da machen?

allapow
08.02.2008, 20:53:42
kann ich PHP sagen, dass das eine Zahl ist? So wie in Java z.B.?

defabricator
08.02.2008, 21:37:47
Ein Zahlenliteral (http://de.wikipedia.org/wiki/Literal), das mit 0 anfängt, wird als Oktalzahl interpretiert.
http://de.wikipedia.org/wiki/Oktal

allapow
08.02.2008, 22:29:33
ok, mit '0' ist es eine oktale Zahl. Mit einfacher Typzuweisung:
$zahl = (int) 0233193;
geht es nicht.

ich finde nicht wie ich PHP sage, dass es eine dezimale Zahl ist. Hexadezimal finde ich auch noch und oktal war dann mit '0'... aber wie wenn ich dezimal meine?

defabricator
09.02.2008, 10:23:25
ich finde nicht wie ich PHP sage, dass es eine dezimale Zahl ist.Indem Du PHP nicht sagst, dass es eine Oktalzahl sei. Lass die 0 weg beim Literal. Sonst ist das so, als wenn Du den Fisch bestellst und Dich dann ärgerst, dass Du kein Fleisch bekommen hast.
Wir reden hier aber nur von Literalen, also von etwas, das Du direkt ins Skript schreibst.
Du schreibst die Zahl direkt ins Skript$dest = 0233193;d.h. wenn der PHP Parser arbeitet, findet er die Ziffernfolge und interpretiert sie, führende 0 also Oktal.
Wenn der Wert zum Beispiel aus einer Benutzereingabe per HTML Formular stammt, gilt das nicht. Erstens gelangt die Eingabe dann als Zeichenkette in die variable und zweitens ignoriert PHP führende Nullen bei der Umwandlung Zeichenkette->Zahl einfach.<html><head><title><body>
<pre><?php if (isset($_POST['zahl'])) echo (int)$_POST['zahl'] - 3; ?></pre>
<form method="post" action="?">
<div>
<input type="text" name="zahl" value="0233193" />
<input type="submit" />
</div>
</form>
</body></html>233190

z0iD
09.02.2008, 13:22:43
Fazit,
$zahl = (int) '0233193';
sollte es tun

defabricator
09.02.2008, 13:24:43
Das ist dann ein Zeichenkettenliteral und die daraus resultierende Zeichenkette wird in eine Zahl (ohne führende Null) umgewandelt. Was zum Henker ist der Sinn davon?

z0iD
09.02.2008, 13:53:59
Naja ich frage mich was der Sinn der ganzen Aktion überhaupt sein soll. Er will ja offenbar eine Variable konstant definieren und möchte da eine führende 0 beischreiben. Warum auch immer.

defabricator
09.02.2008, 17:49:22
jo, das meinte ich ja. Was ist letztendlich Dein Ziel, allapow?

allapow
09.02.2008, 19:41:47
die revolutionäre Telefonanlage Asterisk soll meinem PHP Script die gewählte Nummer des Anrufenden übergeben. Meist sind da zwei Nullen vorne an (international) oder eine (national) und wenn es gar keine Null am Anfang gibt muss ich das auch wissen.

Ich kann per STDIN STDOUT die gewählte Nummer in mein Script bringen oder ich übergebe die Nummer beim Aufruf des Scripts als Argument. Beides habe ich noch nicht versucht... bis jetzt testete ich mein Script nur mit einer Nummer die ich am Anfang des Scripts selber fest lege.

Am Ende muss ich aber wissen ob die gewählte Nummer international, national oder lokal ist. Denn ich will, bevor ein Anruf zu Stande kommt, wissen ob und wie die gewählte Nummer zu tarifieren ist.

defabricator
09.02.2008, 21:10:00
Dann sind es keine Literale, sondern Zeichenketten, die von "außen" stammen. Da nimmt PHP keine Veränderungen vor. Aber wenn Du sie irgendwo in Zahlenwerte umwandelst, dann sind die Nullen weg, da sie keine Bedeutung haben. Behalte die Werte also besser als Zeichenketten bei (Zeichenketten, die eine Zahl darstellen).Also zum Testen schon so:Fazit,
$zahl = (int) '0233193';
sollte es tunnur ohne das (int), einfach nur das Zeichenkettenliteral.

allapow
10.02.2008, 19:11:02
ok, dank euch!