php的循环与引用的一个坑,php循环引用
php的循环与引用的一个坑,php循环引用
上代码
<span>$arr</span> = <span>array</span><span>( </span>'a'=> 'a11', 'b'=> 'b22', 'c'=> 'c33',<span> ); </span><span>foreach</span> (<span>$arr</span> <span>as</span> <span>$k</span>=>&<span>$v</span><span>){ </span><span>//</span><span> Do somethind</span> <span>} </span><span>foreach</span> (<span>$arr</span> <span>as</span> <span>$k</span>=><span>$v</span><span>){ </span><span>var_dump</span>(<span>$v</span><span>); }</span>
这样的代码, var_dump 会输出什么? 各位可以试试, 答案
<span>string</span>(3) "a11" <span>string</span>(3) "b22" <span>string</span>(3) "b22"
结果里, 第三行变成了 key='b' 的value. 问题就出在第一个循环的引用.
今天就踩到了一个这样的坑, 查问题用了很久. 简单来说, foreach循环使用的引用, 循环结束后有所保留. php.net 着重写了:
Warning
Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset().
对于上面这个例子, 第一个循环结束后, $v引用仍然存在. 由于两个循环的变量命名一致, 第二个循环开始, $v 每次都会被赋值. 直到最后, $v 被设置成了
前一个元素的值.
原理很简单, 文档写的明明白白. 但如果工作中遇到相关的bug是很坑的, 定位需要很久. 还得需要写码的时候就注意:
1. 减少引用的使用
2. 如果需要在foreah使用引用, 应该用函数将封装起来

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Wir wissen, dass in der C-Sprache das Schlüsselwort „while“ verwendet wird, um eine Schleife zu definieren, die auf der Grundlage der an die Schleife übergebenen Bedingung funktioniert. Da die Bedingung nun zwei Werte haben kann, wahr oder falsch, wird der Code im while-Block wiederholt ausgeführt, wenn die Bedingung wahr ist, und nicht ausgeführt, wenn die Bedingung falsch ist. Durch die Übergabe von Parametern an die while-Schleife können wir nun zwischen while(1) und while(0) unterscheiden, da while(1) eine Schleife ist, in der die Bedingung immer als wahr gilt und der Code im Block daher wiederholt ausgeführt wird. Darüber hinaus können wir sagen, dass es nicht 1 ist, die an die Schleife übergeben wird, die die Bedingung wahr macht, sondern wenn eine beliebige Ganzzahl ungleich Null an die while-Schleife übergeben wird, wird sie als die wahre Bedingung betrachtet, also

Die Verwendung von while ist „while-Bedingung: Codeblock“. Wenn die Bedingung wahr ist, wird der Codeblock ausgeführt, und dann wird erneut beurteilt, ob die Bedingung wahr ist Der Block wird so lange ausgeführt, bis die Bedingung falsch ist. while ist eine häufig verwendete Schleifenkontrollanweisung, mit der ein Codeblock wiederholt ausgeführt wird, wenn bestimmte Bedingungen erfüllt sind.

In der Go-Sprache ist while kein Schlüsselwort. Sie können die for-Anweisung plus break verwenden, um den Effekt einer while-Schleife zu erzielen, z. B. „for {sum++ if sum>10{break}else{...}}“. Die Go-Sprache verfügt über 25 Schlüsselwörter wie break, default, func, select, case, defer, go, map, else, goto, for, if, var usw.

Was sind die gängigen Flusskontrollstrukturen in Python? In Python ist die Flusskontrollstruktur ein wichtiges Werkzeug zur Bestimmung der Ausführungsreihenfolge des Programms. Sie ermöglichen es uns, verschiedene Codeblöcke basierend auf unterschiedlichen Bedingungen auszuführen oder einen Codeblock wiederholt auszuführen. Im Folgenden werden gängige Prozesssteuerungsstrukturen in Python vorgestellt und entsprechende Codebeispiele bereitgestellt. Bedingte Anweisungen (if-else): Bedingte Anweisungen ermöglichen es uns, verschiedene Codeblöcke basierend auf unterschiedlichen Bedingungen auszuführen. Die grundlegende Syntax lautet: if Bedingung 1: #when Bedingung

Hinweis 1. Die chinesische Bedeutung des Schlüsselworts while ist when..., das heißt, wenn die Bedingung erfüllt ist, wird der entsprechende Code in einer Schleife ausgeführt. Die while-Anweisung ist die Grundstruktur der Schleifenanweisung und das Syntaxformat ist relativ einfach. Ausführungsprozess 2. Bestimmen Sie beim Ausführen einer while-Anweisung zunächst die Schleifenbedingung. Wenn die Schleifenbedingung falsch ist, wird der nachfolgende Code der while-Anweisung direkt ausgeführt. Wenn die Schleifenbedingung wahr ist, wird der Schleifenkörpercode ausgeführt Die Bedingung wird so lange bestimmt, bis die Schleifenbedingung nicht mehr erfüllt ist. Beispiel inti=1;intsum=0;while(i

Ausführliche Erläuterung der Rolle und Verwendung des Schlüsselworts „break“ in PHP. In der PHP-Programmierung ist „break“ eine Kontrollflussanweisung, die verwendet wird, um die aktuelle Schleife oder Switch-Anweisung zu unterbrechen und aus der Schleife oder dem Switch zu springen. In diesem Artikel werden die Rolle und Verwendung des Schlüsselworts break im Detail vorgestellt. 1. Unterbrechung einer Schleife In einer Schleifenstruktur besteht die Funktion von Unterbrechung darin, die Schleife vorzeitig zu beenden und aus dem Schleifenkörper zu springen, um den Code nach der Schleife auszuführen. Zu den gängigen Schleifenstrukturen gehören for, while und do...while. in der for-Schleife

While-Schleife ist eine Kontrollflussstruktur, mit der Anweisungen wiederholt ausgeführt werden, bis eine Bedingung falsch ist. Das Prinzip besteht darin, die Bedingung zu überprüfen. Wenn sie wahr ist, wird der Schleifenkörper ausgeführt und dann die Bedingung überprüft, bis die Bedingung falsch ist. Es eignet sich für Situationen, in denen eine Operation wiederholt ausgeführt werden muss, eine Operation ausgeführt werden muss, wenn eine Bedingung wahr ist, oder eine Schleife basierend auf einer Bedingung übersprungen werden muss. Zu den praktischen Beispielen gehören das Drucken gerader Zahlen, das Berechnen von Primzahlen und die Verwendung der break-Anweisung zum Ausbrechen von Schleifen.

Java verwendet publicvoidhandleConnection(SocketconnectionToHandle){newThread(newConnectionHandler(connectionToHandle)).start();}publicvoidhandleConnection(SocketconnectionToHandle){newThread(newConnectionHandler(connectionToHandle)).start();} und verwendet RemoteFileSer
