![]() |
Fehler bei php.net melden?
Mir ist grade ein Fehler in PHP 5 aufgefallen.
(dachte erst das liegt an meinem Code und ich hab alles seit gestern umgegraben und sonstwo gesucht und getestet) Hab das jetzt alles auf diesen Code zusammengeschrumpft,
PHP-Quellcode:
welches als Ergebnis "one two tree four four" liefert
<?php
$arr = array('one', 'two', 'tree', 'four', 'five'); foreach ($arr as &$str) $str = machwas($str); foreach ($arr as $str) echo $str; ?> hierbei ändert sich bei jedem Schritt der letzte Array-Eintrag.
PHP-Quellcode:
<?php
echo '<pre>'; $arr = array(' one ', ' two ', ' tree ', ' four ', ' five '); print_r($arr); echo "\n"; foreach ($arr as &$str) $str = trim($str); foreach ($arr as $str) { print_r($arr); echo "\n$str\n\n"; } print_r($arr); ?> So, hatte das jetzt erstmal hier gepostet: ![]() und hab nun auch die Bug-Abteilung gefunden. jetzt suche ich aber schon 'ne Weile viele Einträge ab, ob die was mit meinem Problem zu tun haben und hab noch Unmassen vor mir, da ich auch nicht genau weiß nach was ich suchen soll. Kennt schon jemand das Problem oder hat dazu schon einen Eintrag entdeckt? Ach ja: Selber hab'sch das in PHP 5.2.4 und 5.3.0 reproduzieren können. [add] und nun hab'sch och den Grund für die Änderung (aber k.A. auf was die Referenz zeigt)
PHP-Quellcode:
$arr = array(' one ', ' two ', ' tree ', ' four ', ' five ');
foreach ($arr as &$str) $str = trim($str); var_dump($arr);
Code:
array(5) {
[0]=> string(3) "one" [1]=> string(3) "two" [2]=> string(4) "tree" [3]=> string(4) "four" [4]=> &string(4) "five" } |
AW: Fehler bei php.net melden?
ganz ehrlich sehe ich das nicht als bug an das kuddelmuttel entsteht wenn bei einer foreach schleife die Variable geändert wird durch welche iteriert wird.
[Edit] Ich nehms zurück, hab irgendwie schief hin geschaut - sorry Aber um ehrlich zu sein ist mir rätselhaft warum du vor deiner Schleifenvariablen ein & platzierst. Was willst du eigentlich damit bewirken? |
AW: Fehler bei php.net melden?
Eher die Tatsache, dass mann das kann
|
AW: Fehler bei php.net melden?
Aber diese Möglichkeit eines änderbaren Values ist offiziell von denen vorgeschlagen und genau auf php.net hatte ich dieses auch mal irgendwo gefunden und fand es eigentlich recht praktisch.
Zitat:
![]() [edit] Ein
PHP-Quellcode:
nach der Schleife hilft wirklich :shock:
unset($str);
Na gut, dann werd ich mal alle forschleifen abgrasen und das einfügen. |
AW: Fehler bei php.net melden?
wieder was gelernt. Ich wusste bis eben nicht das es möglich ist auf diese Art und Weise die Variable zu ändern welche durch iteriert wird.
|
AW: Fehler bei php.net melden?
Führt auch zur Verwirrung. Ich würde von dieser Möglichkeit besser Abstand nehmen
|
AW: Fehler bei php.net melden?
hm. Ich sah das bisher immer als gewissen Performance-Vorteil. Dürfte doch wohl leichter sein, "nur" den Pointer weiterzuschieben, als immer gleich den gesamten Record zu kopieren. Ich habe viele foreach-Schleifen so aufgebaut, auch wenn ich den Wert gear nicht verändere.
|
AW: Fehler bei php.net melden?
Bei Strings und Objekten handelt PHP das ja anscheinend sowieso schon als referenzzählende Zeiger.
Aber vorallem beim Ändern fand/finde ich es von Vorteil, daß man direkt auf den Wert zugreifen kann und nicht jedesmal wieder über das Ursprungsobjekt/-array gehn zu, wo dann der Wert ja erneut gesucht werden müßte.
PHP-Quellcode:
foreach ($this->Parent->Files as $File)
|
AW: Fehler bei php.net melden?
Normalerweise kannst du die Bugs direkt unter
![]() Greetz alcaeus |
AW: Fehler bei php.net melden?
Hier mal die Antwort eines PHP-Entwicklers (also Entwickler am Core). Ich hab ihm diesen Beispielcode geschickt:
PHP-Quellcode:
$array = array(' one ', ' two ', ' three ', ' four ', ' five ');
foreach ($array as &$str) $str = trim($str); foreach ($array as $str) echo $str; Zitat:
Greetz alcaeus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz