cybton.com
Über uns | Jobs | Werbung | Sitemap | AGB | Impressum | Hilfe ?
 Kostenlos anmelden)
Forum
Aktuellste Beiträge
Forenregeln

Community
BB-Codes
Tags
Chat
Suche (Web)
Wer ist online?
Top-User

Basar


Statistik
Mitglieder gesamt: 68138
Mitglieder online: 7
Gäste online: 2
mehr...

Anzeige
Forum » Forum: Website & Webprogrammierung » Thread: Nur einen Teil einer Variable ausgeben

Thread: Nur einen Teil einer Variable ausgeben

Seite 1 von 51234Letzte »

14.08.2008 03:28 Uhr

 

Status: offline
Hallo Community

Ich habe schwierigkeiten mit einem Scriptchen.

Habe es derzeit auch schon soweit, das er mir die werte aktualisiert jedoch ist die variablen ausgabe nicht
so wie ich sie gerne hätte.

Hier das Script vorweg

<?php

$fp = fsockopen('127.0.0.1', 51234); // zum Server verbinden
if(fgets($fp)=="[TS]\r\n") // Antwort des Servers lesen

{
fputs($fp,"gi\r\n"); // Befehl senden
$result=fread($fp,1024); // Antwort lesen //Ruft immer die aktuellen werte bei Seitenrefresh ab
}

fclose($fp);

Die Variablen, die ich habe:
Die hier Stehenden Werte, werden innerhalb des Scripts übergeben
__________________________________________________________
total_server_uptime=7D 23:18:16
total_server_version=2.0.23.19
total_server_platform=Linux
total_servers=35
total_users_online=16
total_users_maximal=1416
total_channels=801
total_bytesreceived=5947571275
total_bytessend=12552185152
total_packetssend=32327841
total_packetsreceived=52953448
total_bwoutlastmin=12233
total_bwoutlastsec=17500
total_bwinlastmin=7455
total_bwinlastsec=8995
isp_ispname=
isp_linkurl=
isp_adminemail=mail@mail.de
isp_countrynumber=4428
OK
__________________________________________________________

// Übergabe an den 2. Scriptabschnitt
$variable = $result;


$suchterm ='total_bytessend=';

//Position des Suchterms ermitteln und Länge des Suchterms addieren --> Startposition
$i = strpos($result,$suchterm)+strlen("$suchterm");

// Position des ersten Leerzeichens nach dem Suchterm ermitteln
$l = strpos($variable," ",$i);

//Teilstring bilden von Start bis Leerzeichen
$wert = substr($variable,$i,$l-$i);

echo $wert;

?>

Der Wert, der nun ausgegeben wird sieht so aus

12579413746 total_packetssend=32409222 total_packetsreceived=53067566 total_bwoutlastmin=5433 total_bwoutlastsec=10266 total_bwinlastmin=4058 total_bwinlastsec=7065 isp_ispname=Private

was aber falsch ist, da ich nur die zahlen am anfang benötige

Kann mir da vielleicht wer weiterhelfen?  :question: 

Danke schonmal

Stefan
___________________________
Jeder darf anfangs dumm sein, jedoch sollte man auch bereitschaft zum lernen zeigen!
14.08.2008 08:34 Uhr

 

Status: offline
Also wenn ich das richtig sehe, liefert $i nicht die Position des ersten Leerzeichens nach dem Suchstring, sondern die des ersten Leerzeichens im gesamten Ergebnisstring!

Ich würde vorschlagen nach der Ermittlung von $i folgendes einzufügen:
$variable=substr($result, $i);

Dann wird nur der Teilstring durchsucht, der nach der gefundenen Stelle ist.
Die Zuweisung $variable = $result; vom Anfang sollte dann übrigens unnötig sein.

Achja, ausserdem muss es dann
$wert=substr($variable, $I);
heissen.

So, ich hoffe ich hab keinen Denkfehler drin  :lol: 
14.08.2008 09:36 Uhr

 

Status: offline
Nein. Der Wert $i enthält die erste Position im Suchstring, $l das erste Leerzeichen welches nach dem Offset $i auftritt. Folgender Code liefert bei mir das korrekte Ergebnis:
+ PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$variable = 'total_packetssend=32409222 total_packetsreceived=53067566 total_bwoutlastmin=5433 total_bwoutlastsec=10266 total_bwinlastmin=4058 total_bwinlastsec=7065 isp_ispname=Private';
 
$suchterm ='total_bwoutlastsec=';
 
//Position des Suchterms ermitteln und Länge des Suchterms addieren --> Startposition
$i = strpos($variable,$suchterm)+strlen($suchterm);
var_dump($i);
// Position des ersten Leerzeichens nach dem Suchterm ermitteln
$l = strpos($variable," ",$i);
var_dump($l);
//Teilstring bilden von Start bis Leerzeichen
$wert = substr($variable,$i,$l-$i);
echo $wert;
Einzige Änderung bei mir in Zeile 7:
$i = strpos($variable,$suchterm)+strlen($suchterm);

Eine andere Möglichkeit wäre ein regulärer Ausdruck:
PHP:
1
2
3
4
5
6
<?php
$suchterm = 'total_bwoutlastsec';
 
$matches = array();
preg_match('/'.$suchterm.'=(\S+)/i',$variable,$matches);
var_dump($matches);
$matches[1] enthält anschließend deinen gesuchten Wert

Und falls du immer alle Variablen benötigst (oder auch einige mehrfach), würde sich explode() oder ebenfalls ein regulärer Ausdruck anbieten:
PHP:
1
2
3
4
<?php
preg_match_all('/(\S+)=(\S+)/',$variable,$matches);
$variables = array_combine($matches[1],$matches[2]);
var_dump($variables);
Anschließend kannst du über $variables[$suchterm_ohne_gleichzeichen] direkt auf den Wert zugreifen.
1 mal bearbeitet
___________________________
Programmieren ist eine Sucht deren Rausch ein Gefühl der Macht ist... sofern man den Computer bezwingt. Gefährliche Nebenwirkungen: Verstärkter Kaffee-Konsum, erhöhter Ehrgeiz und ggf. Wutausbrüche und verknotete Gehirnwindungen.
14.08.2008 11:13 Uhr

 

Status: offline
Guten Morgen.

Danke erstmal für die Antworten.
Grundsätzlich möchte ich nur die total_bytessend und total_packetsreceived Variablen.
Sie sollen ausgelesen, extrahier, addiert und dann dividiert werden.

also...

Zuerst steht die Auslesung
total_bytesreceived=5947571275
total_bytessend=12552185152

Nun die Zahlen extrahieren und addieren das ich den gesamttraffic erhalte.
$rein = 5947571275 + $raus = 12552185152 == $gesamt 18499756427
nun muss das ganze so lange dividiert werden bis man eben GB statt Bytes hat.

und das $endergebnis soll dann auch direkt als GB ausgegeben werden.

hoffe ich hab das ganze nicht zu unklar jetzt geschrieben (iss noch so früh am morgen  :wink:  )
___________________________
Jeder darf anfangs dumm sein, jedoch sollte man auch bereitschaft zum lernen zeigen!
14.08.2008 12:58 Uhr

 

Status: offline
Also die eleganteste Lösung steht wohl in meinem letzten Post ganz unten. Man könnte das Pattern noch soweit modifizieren, dass nur die Variablen gesucht werden, die mit total_bytes beginnen. Anschließend kannst du per array_sum() gleich die Summe über alle gefundenen (zwei) Variablen bilden und das dann in GB umrechnen
PHP:
1
2
3
<?php
preg_match_all('/total_bytes(?:send|received)=(\d+)/i',$variable,$matches);
$gbtotal = array_sum($matches[1]) / pow(1024,3);
Erklärung zum Pattern:
Muster beginnt mit "total_bytes" und hat anschließend entweder "send" oder "received" (zur Sicherheit case-insensitiv), dann kommt das Gleichzeichen und abschließend eine beliebig lange Zahl mit Mindestlänge 1. Ergebnis ist ein 2D-Array. Index 0 ist wie immer ein Array mit dem vollständigen übereinstimmenden Ausdruck, Index 1 enthält einen Array mit Zahlenwerten aller übereinstimmender Muster.

Über die Zahlenwerte unter Index 1 bildet man mal eben die Summe und teilt das Ganze durch eine Zahl zur Umrechnung von Byte in GB (also [B->]kB->MB->GB = 1024*1024*1024 = 1024^3 = pow(1024,3))

Edit: Früh am Morgen? um 11:13 ist ein Programmierer schon mindestens 26 Stunden wach  :lol: 

Edit2: Vor der Ausgabe sollte man die Zahl natürlich noch auf 2 bis 3 Stellen runden, weil das schon ziemlich krumme Werte werden können
2 mal bearbeitet
___________________________
Programmieren ist eine Sucht deren Rausch ein Gefühl der Macht ist... sofern man den Computer bezwingt. Gefährliche Nebenwirkungen: Verstärkter Kaffee-Konsum, erhöhter Ehrgeiz und ggf. Wutausbrüche und verknotete Gehirnwindungen.
14.08.2008 20:12 Uhr

 

Status: offline
@HANGMAN!!!:
Zitat:
zur Umrechnung von Byte in GB (also [B->]kB->MB->GB = 1024*1024*1024 = 1024^3 = pow(1024,3))

=> 1byte = 1024kB = 1048576MB = 1073741824GB
=> 1byte = 1073741824 GigaByte?
dividieren ist schon richtig ;-)  :roll: 
1 mal bearbeitet
___________________________
Faulheit ist wenn man mit einem Glas Milch in der Hand auf das nächste Erdbeben wartet um einen Milchshake zu trinken.
Chuck Norris hat mehr Kreditkarten als Max Mustermann!
Sido fragte mal "Wer ist Chuck Norris?". Seitdem trägt er eine Maske.
14.08.2008 20:19 Uhr

 

zombie3456
Programmierer
Status: offline
Zitat:
=> 1byte = 1024kB = 1048576MB = 1073741824GB
=> 1byte = 1073741824 GigaByte?
dividieren ist schon richtig ;-)  :roll: 
Joa, es ging ihm bei der Liste auch um den Umrechnungsfaktor, wie er ihn in seinem Beispiel als Divisor verwendet.
1 mal bearbeitet
___________________________
DURATIVUM | Blog zur Sprache Latein
14.08.2008 20:47 Uhr

 

Status: offline
Natürlich wird zur Berechnung in größere Einheiten dividiert. Steht ja auch im Codeschnipsel. Aber in der Tat hab ich den Teil etwas missverständlich da hingeschrieben. Korrekterweise hätten die Pfeile umgedreht sein, oder aber 1/(1024^3) dort stehen müssen. Ich werd das mal vielleicht etwas ändern. Außerdem war es ja schon spät: 12:58. Da war ich seit fast 28h wach  :roll: 

Edit: Und wenn man den Text vollständig lesen würde, dann würde man auch sehen, dass das kaum eine Zeile weiter oben vor deinem geschickt ausgewählen Zitat steht:
Zitat:
Über die Zahlenwerte unter Index 1 bildet man mal eben die Summe und teilt das Ganze durch eine Zahl zur [...]
1 mal bearbeitet
___________________________
Programmieren ist eine Sucht deren Rausch ein Gefühl der Macht ist... sofern man den Computer bezwingt. Gefährliche Nebenwirkungen: Verstärkter Kaffee-Konsum, erhöhter Ehrgeiz und ggf. Wutausbrüche und verknotete Gehirnwindungen.
15.08.2008 04:00 Uhr

 

Status: offline
ich scheine wohl doch zu dumm zu sein, um das zu kapieren!  :conf: 
ich war diesmal so frei und hab die daten eingetragen gelassen...
+ PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
<?php
$fp = fsockopen($ip, $udpport); // zum Server verbinden
if(fgets($fp)=="[TS]\r\n") // Antwort des Servers lesen
{
      fputs($fp,"gi\r\n"); // Befehl senden
      $ergebnis=fread($fp,1024); // Antwort lesen
}
fclose($fp); //Verbindung schließen
 
echo nl2br($ergebnis);      // zwischenausgabe zum testen und nachrechnen,
                                    //wenn ergebnisse vorliegen
 
$variable = $ergebnis;
 
preg_match_all('/total_bytes(?:send|received)=(\d+)/i',$variable,$matches);
$gbtotal = array_sum($matches[1]) / pow1/(1024^3);
 
echo $gbtotal
?>
ich bekomm vom server dann nur noch die rückmeldung

Warning: Division by zero in /srv/www/vhosts/das-sind-wir.net/httpdocs/1.php on line 21
0


Nun seid ihr wieder gefragt... ich steh vor nemm riesigen fragezeichen...
Soweit ich es versteh, kann er den wert 0 nicht dividieren.
Ergo, so meine schlussfolgerung: Kommen keine daten bei
"""$gbtotal = array_sum($matches[1]) / pow1/(1024^3);"""
an.

oder seh ichs falsch?!

Danke nochmals.
Hoffe ihr könnt mit den neuen erkenntnissen was anfangen :)
1 mal bearbeitet
___________________________
Jeder darf anfangs dumm sein, jedoch sollte man auch bereitschaft zum lernen zeigen!
15.08.2008 08:32 Uhr

 

zombie3456
Programmierer
Status: offline
PHP:
1
<?php $gbtotal = array_sum($matches[1]) / pow1/(1024^3);
pow1/(1024^3) was ist denn das? Ich kann dir genau erklären, woher die Division bei Zero kommt. PHP interpretiert pow1 als eine Konstante, die nicht existiert, und fügt daher 0 ein:
array_sum($matches[1]) / 0 / (1024^3)

Ich frag mich allerdings, wie du plötzlich auf pow1/(1024^3) kommst. Im Quelltext von HangMan steht es doch ganz deutlich:
PHP:
1
<?php $gbtotal = array_sum($matches[1]) / pow(1024,3);
pow() ist eine PHP-Funktion zur Potenzrechnung. Weiteres steht in der Manual zu pow().
1 mal bearbeitet
___________________________
DURATIVUM | Blog zur Sprache Latein
Seite 1 von 51234Letzte »
Ähnliche Threads Forum Ähnlichkeitsgrad
 Cannot use string offset as an array Website & Webprogrammierung 1
 [gelöst][Java] readUTF(String) in Integer umwandeln Softwareprogrammierung 1
 [gelöst][PHP] - letzen Bereich eines Strings auslesen Website & Webprogrammierung 1
nach obennach oben

Copyright © 2008 cybton-network

Google
Partner: #Musik - Dein Internetradio - nexem. - .wir machen news - Your-Book.net - Dein kostenloses Gästebuch
ANEXIA - PHP Entwicklung - Dockers - s.Oliver Schuhe - Think Schuhe - der eigene Weg - Dorfen - Paul Green Schuhe - Bequeme Geox - Web-Entwicklung