| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

02-07-2009, 13:16
|
|
RamonaS
Registrierter Benutzer
|
|
Registriert seit: Mar 2009
Beiträge: 177
|
|
Index 0 aus array entfernen?
Hallo,
Ich möchte per echo den inhalt aller array-elemente ausgeben, ausser dem ersten elemend - index 0
Das habe ich so gemacht:
PHP-Code:
foreach($arr as $line)
{$zt=explode("|",trim($line));
echo "<br />".$zt[1]."|".$zt[2]."|".$zt[3]."|".$zt[4]."|".$zt[5];
}
Irgendwie sagt mir mein gefühl das man das kürzer schreiben kann.
Geht das oder muß die ECHO-Zeile so lang sein?
|

02-07-2009, 13:20
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
PHP-Code:
foreach ($arr as $line) { echo "<br />" . trim(substr($line, strpos($line, "|"))); }
Geändert von h3ll (02-07-2009 um 13:23 Uhr)
|

02-07-2009, 13:21
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
array_shift() und implode() könnten helfen.
Alternativ:
strpos() und substr()
|

02-07-2009, 13:40
|
|
RamonaS
Registrierter Benutzer
|
|
Registriert seit: Mar 2009
Beiträge: 177
|
|
Danke h3ll
Bei dir ist noch'n kleiner schönheitsfehler drin, der string befinnt mit einm | der dort weg sollte.
...aber ich hatte selber eine zündende idee, und zwar beinhaltet index 0 eine timestamp und ist somit immer gleich lang, habe jetzt das hier angewendet
echo "<br />".trim(substr($line,11));
das funktioniert sehr gut.
|

02-07-2009, 13:41
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von RamonaS
Danke h3ll
Bei dir ist noch'n kleiner schönheitsfehler drin, der string befinnt mit einm | der dort weg sollte.
|
Dann erhöhe den Wert des Offsets um 1.
|

02-07-2009, 13:59
|
|
RamonaS
Registrierter Benutzer
|
|
Registriert seit: Mar 2009
Beiträge: 177
|
|
Jetzt wirds peinlich hier:-)
>Dann erhöhe den Wert des Offsets um 1.
Was ist das denn wieder....Offsets kenn ich nur von meinen fehlermeldungen, wenn ich mit einem array was anstelle bis nix mehr geht:-)
|

02-07-2009, 14:04
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von RamonaS
Jetzt wirds peinlich hier:-)
>Dann erhöhe den Wert des Offsets um 1.
Was ist das denn wieder....Offsets kenn ich nur von meinen fehlermeldungen, wenn ich mit einem array was anstelle bis nix mehr geht:-)
|
Ich meine die Startposition von substr():
PHP: substr - Manual
|

02-07-2009, 14:10
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von RamonaS
Jetzt wirds peinlich hier:-)
|
Ja - weil du dich jetzt schon zum wiederholten Male darauf hinweisen lässt, bitte die [quote]-Tags zu nutzen, wenn du aus einem Vorposting zitierst!
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

03-07-2009, 11:41
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Dabei genügt es schon, einfach auf den "Zitieren"-Button zu drücken.
Zitat:
Zitat von RamonaS
...aber ich hatte selber eine zündende idee, und zwar beinhaltet index 0 eine timestamp und ist somit immer gleich lang, habe jetzt das hier angewendet
echo "<br />".trim(substr($line,11));
|
Wer sagt, dir dass ein Timestamp immer eine Zahl mit elf Ziffern ist?
PHP-Code:
echo date('Y-m-d H:i:s', 1000000000), $lf;
// gibt: 2001-09-09 03:46:40 (für CET)
Also schneidet dein Script bei Daten vor dem 9. September ein Zeichen zu viel ab.
Ich kann mir allerdings deine Antwort auf dieses Argument schon denken ...
Zitat:
das funktioniert sehr gut.
|
Das liegt im Auge des Betrachters, ich würde einen Einzeiler vorziehen.
PHP-Code:
$zt = 'a|b|c|d|e';
$lf = '<br />';
// die unvermeidliche preg_replace()-Lösung: B-)
echo preg_replace('/\A[^|]*\|/', '', $zt), $lf;
Der passt auch noch, wenn sich das Format des zu entfernenden Teils einmal ändert, weil keine feste Länge angenommen, sondern nach dem Trennzeichen gesucht wird. Man kann das natürlich auch mit strpos() und substr() nachbauen ...
Die Standard-Stringfunktionen von PHP haben das Problem, dass sie das erste Trennzeichen leider immer stehen lassen:
PHP-Code:
echo strstr($zt, '|'), $lf;
echo strpbrk($zt, '|'), $lf;
Eine interessante Lösung wäre auch noch die mit preg_split(), aber man muss dazu dann noch list() bemühen. Eleganten Quellcode zu schreiben, ist halt in PHP nicht wirklich drin:
PHP-Code:
// preg_split(,$zt, 2) teilt $zt nur einmal (in [b]2[/b] Teile),
// list (, $out) verwirft den ersten gleich wieder
list (, $out) = preg_split('/\|/', $zt, 2);
echo $out, $lf;
Eventuell geht das auch mit explode() -- ich war zu faul, es zu testen.
Ein (in PHP zumindest bis 5.2.x nicht möglicher) Einzeiler wäre:
PHP-Code:
echo (preg_split('/\|/', $zt, 2))[1], $lf;
In anderen Script-Sprachen geht sowas.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (03-07-2009 um 11:44 Uhr)
|

03-07-2009, 13:58
|
|
RamonaS
Registrierter Benutzer
|
|
Registriert seit: Mar 2009
Beiträge: 177
|
|
Zitat:
Zitat von fireweasel
Also schneidet dein Script bei Daten vor dem 9. September ein Zeichen zu viel ab.
Ich kann mir allerdings deine Antwort auf dieses Argument schon denken ...
// die unvermeidliche preg_replace()-Lösung: B-)
echo preg_replace('/\A[^|]*\|/', '', $zt), $lf;
|
Naja, ich hab eigentlich keine daten von der zeit als timestamp noch kürzer als 10 zeichen war
...aber ich werde die "unvermeidliche preg_replace()-Lösung" von dir zum einsatz bringen.
Ich muß dir allerdings gestehen, die regex sind für mich noch viel schlimmer als mit arrays rum zu handieren. Ich lass die dann gleich so denn wenn ich da dran fummel tut sie garantiert nicht mehr.
Ok danke für den hinweiß ich werde das dann einbauen.
|

03-07-2009, 15:05
|
|
RamonaS
Registrierter Benutzer
|
|
Registriert seit: Mar 2009
Beiträge: 177
|
|
@fireweasel
So ich hab das jetzt so gemacht:
PHP-Code:
if(isset($_GET['uo']) and $_GET['uo']=="s") # Link wurde geklickt
{echo "<br /><br />";
$arr=explode("\n",file_get_contents($_SERVER["DOCUMENT_ROOT"]."/useronline.txt"));
foreach($arr as $line)
{echo "<br />".preg_replace('/\A[^|]*\|/','',$line),"\n";} # Ganze Zeile anzeigen, ausser Arayy Index 0
}
else
{echo "<a href='".$_SERVER['PHP_SELF']."?uo=s'>(".$all.")</a>";}
unset($dx,$arr,$line,$zt);
Würdest du sagen das dieser scriptteil jetzt perfekt ist oder nur zu 100% ok?
Für änderungsvorschläge hab ich immer ein offenes auge.
|

03-07-2009, 15:18
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Nein, das ist nicht schön!
1. witzig eingerückt! (kaum lesbar)
2. PHP_SELF ermöglicht u.U. XSS Attacken
3. Wozu das unset() ?
|

03-07-2009, 15:24
|
|
jmc
PHP Junior
|
|
Registriert seit: Mar 2006
Beiträge: 868
|
|
1. Viel kürzer von der Textlänge ist das jetzt auch nicht.
2. Übersichtlicher ist es auch sicher nicht.
3. Schneller schon gar nicht.
Warum also sowas?
|

03-07-2009, 16:21
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von RamonaS
...aber ich werde die "unvermeidliche preg_replace()-Lösung" von dir zum einsatz bringen.
|
Das ist in so einem simplen Fall keine gute Idee.
explode leistest hier ganz simpel das gewünschte.
Reguläre Ausdrücke sind i.a.R. kostenintensiver als einfache Stringfunktionen.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

03-07-2009, 19:45
|
|
RamonaS
Registrierter Benutzer
|
|
Registriert seit: Mar 2009
Beiträge: 177
|
|
Zitat:
Zitat von combie
Nein, das ist nicht schön!
1. witzig eingerückt! (kaum lesbar)
2. PHP_SELF ermöglicht u.U. XSS Attacken
3. Wozu das unset() ?
|
zu 2:
Was macht ihr da an stelle von PHP_SELF ? Das soll halt flexibel sein, wird im footerbereich eigeblendet auf jeder seite, also kann ich da kein festen dateinamen einsetzen.
zu 3:
Damit ich auch sicher bin das die varablen/arrays sich nicht addieren oder sowas in der art.
Wie würdest du dieses script schreiben wenn es deins wäre?
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|