php源码调试foreach诡异现象
$array = array(1,2,3,4);
foreach($array as $key => $value) {
$value = &$array[$key];
echo current($array);
}
输出 2 2 3 3
这段代码给我搞懵了,希望大神通过php源码解释一下。
回复内容:
$array = array(1,2,3,4);
foreach($array as $key => $value) {
$value = &$array[$key];
echo current($array);
}
输出 2 2 3 3
这段代码给我搞懵了,希望大神通过php源码解释一下。
首先,要理解这个问题,我们得先将循环拆解,然后看看数组的值会怎么变化:
1) 第一次循环
<code>php</code><code>$value = $array[0]; $value = &$array[0]; // $value现在变成了$array[0]的引用了 </code>
这时的$array = array(1, 2, 3, 4);
2) 第二次循环
<code>php</code><code>$value = $array[1]; // 由于$value引用$array[0],此语句相当于$array[0] = $array[1],也就是$array[0] = 2 $value = &$array[1]; // $value现在变成了$array[1]的引用了 </code>
这时的$array = array(2, 2, 3, 4);
3) 第三次循环
<code>php</code><code>$value = $array[2]; // 由于$value引用$array[1],此语句相当于$array[1] = $array[2],也就是$array[1] = 3 $value = &$array[2]; // $value现在变成了$array[2]的引用了 </code>
这时的$array = array(2, 3, 3, 4);
4) 第四次循环
<code>php</code><code>$value = $array[3]; // 由于$value引用$array[2],此语句相当于$array[2] = $array[3],也就是$array[2] = 4 $value = &$array[3]; // $value现在变成了$array[3]的引用了 </code>
这时的$array = array(2, 3, 4, 4);
现在我们来看一下脚本为什么会输出2233,题主可以试一下在foreach内部使用key($array)来看看它的返回值是什么,你会发现key()函数返回的值都是1,也就是说,数组的指针永远都是指向下标为1的元素,所以在每次循环中,current($array)函数的返回值也永远是下标为1的元素的值。
最后,我们来看看每次循环中,数组下标为1的元素的值是什么?是的,就是下面图中的这些:
至于,为什么key()函数的返回值永远都是1呢,题主可以参考这个网址中的“问题2”,里面有详细的解释:)
其实也搞不懂,因为好奇,就研究了下。
$array = array(1,2,3,4);
foreach($array as $key => $value) {
echo current($array);
}
看看这个结果,也许你会诧异,我也诧异,指针并没有变化。答案是:2 2 2 2
所以current($array)永远只会输出这个数组的下标为1的值。之所以输出2 2 3 3 ,你现在也知道,$value = &$array[$key];这句改变了原来数组的值了。
$array = array(1,2,3,4);
foreach($array as $key => $value) {
$value = &$array[$key];
echo current($array);
var_dump($array);
}
再输出看看,果然然来的数组的值一直在改变。问题又来了,那么为什么会变呢?
http://segmentfault.com/q/1010000002676308
参考这个,这个问题懂了,你就自然懂了。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Dans ce chapitre, nous comprendrons les variables d'environnement, la configuration générale, la configuration de la base de données et la configuration de la messagerie dans CakePHP.

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Pour travailler avec la date et l'heure dans cakephp4, nous allons utiliser la classe FrozenTime disponible.

Pour travailler sur le téléchargement de fichiers, nous allons utiliser l'assistant de formulaire. Voici un exemple de téléchargement de fichiers.

Dans ce chapitre, nous allons apprendre les sujets suivants liés au routage ?

CakePHP est un framework open source pour PHP. Il vise à faciliter grandement le développement, le déploiement et la maintenance d'applications. CakePHP est basé sur une architecture de type MVC à la fois puissante et facile à appréhender. Modèles, vues et contrôleurs gu

Le validateur peut être créé en ajoutant les deux lignes suivantes dans le contrôleur.

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c
