/
76b41bca.html
333 lines (303 loc) · 53.2 KB
/
76b41bca.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
<!DOCTYPE html><html class="theme-next gemini use-motion" lang="zh-Hans"><head><meta name="generator" content="Hexo 3.8.0"><meta name="google-site-verification" content="SJDgyqjBwkGnbvvQE_jdQKhgkQfRh7WhtS0-E3egoyk"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1"><meta name="theme-color" content="#222"><meta name="viewport" content="width=device-width"><script src="/lib/pace/pace.min.js?v=1.0.2"></script><link href="/lib/pace/pace-theme-minimal.min.css?v=1.0.2" rel="stylesheet"><meta http-equiv="Cache-Control" content="no-transform"><meta http-equiv="Cache-Control" content="no-siteapp"><link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css"><link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css"><link href="/css/main.css?v=5.1.4" rel="stylesheet" type="text/css"><link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=5.1.4"><link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=5.1.4"><link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png?v=5.1.4"><link rel="mask-icon" href="/images/logo.svg?v=5.1.4" color="#222"><meta name="keywords" content="C++,PHP,"><link rel="alternate" href="/atom.xml" title="从入门到放弃" type="application/atom+xml"><meta name="description" content="背景描述先看一段代码。1234567891011121314151617181920212223242526272829&lt;?php/*$arr = [ 'jack' =&gt; '20', 'tom' =&gt; '21', 'marry' =&gt; '54', 'less' =&gt; '23'];$b = &amp;$arr['jack'];$a = $"><meta name="keywords" content="C++,PHP"><meta property="og:type" content="article"><meta property="og:title" content="【从入门到放弃-PHP】foreach 引用的坑"><meta property="og:url" content="https://nc2era.com/76b41bca.html"><meta property="og:site_name" content="从入门到放弃"><meta property="og:description" content="背景描述先看一段代码。1234567891011121314151617181920212223242526272829&lt;?php/*$arr = [ 'jack' =&gt; '20', 'tom' =&gt; '21', 'marry' =&gt; '54', 'less' =&gt; '23'];$b = &amp;$arr['jack'];$a = $"><meta property="og:locale" content="zh-Hans"><meta property="og:image" content="https://nc2era.com/76b41bca/1.png"><meta property="og:image" content="https://nc2era.com/76b41bca/2.png"><meta property="og:image" content="https://nc2era.com/76b41bca/3.png"><meta property="og:image" content="https://nc2era.com/76b41bca/4.png"><meta property="og:image" content="https://nc2era.com/76b41bca/5.png"><meta property="og:image" content="https://nc2era.com/76b41bca/6.png"><meta property="og:image" content="https://nc2era.com/76b41bca/7.png"><meta property="og:image" content="https://nc2era.com/76b41bca/8.png"><meta property="og:image" content="https://nc2era.com/76b41bca/9.png"><meta property="og:image" content="https://nc2era.com/76b41bca/10.png"><meta property="og:image" content="https://nc2era.com/76b41bca/11.png"><meta property="og:image" content="https://nc2era.com/76b41bca/12.png"><meta property="og:image" content="https://nc2era.com/76b41bca/13.png"><meta property="og:image" content="https://nc2era.com/76b41bca/14.png"><meta property="og:image" content="https://nc2era.com/76b41bca/15.png"><meta property="og:image" content="https://nc2era.com/76b41bca/16.png"><meta property="og:image" content="https://nc2era.com/76b41bca/17.png"><meta property="og:image" content="https://nc2era.com/76b41bca/18.png"><meta property="og:image" content="https://nc2era.com/76b41bca/19.png"><meta property="og:image" content="https://nc2era.com/76b41bca/20.png"><meta property="og:image" content="https://nc2era.com/76b41bca/21.png"><meta property="og:image" content="https://nc2era.com/76b41bca/22.png"><meta property="og:image" content="https://nc2era.com/76b41bca/23.png"><meta property="og:updated_time" content="2019-05-26T15:17:09.657Z"><meta name="twitter:card" content="summary"><meta name="twitter:title" content="【从入门到放弃-PHP】foreach 引用的坑"><meta name="twitter:description" content="背景描述先看一段代码。1234567891011121314151617181920212223242526272829&lt;?php/*$arr = [ 'jack' =&gt; '20', 'tom' =&gt; '21', 'marry' =&gt; '54', 'less' =&gt; '23'];$b = &amp;$arr['jack'];$a = $"><meta name="twitter:image" content="https://nc2era.com/76b41bca/1.png"><script type="text/javascript" id="hexo.configurations">var NexT=window.NexT||{},CONFIG={root:"/",scheme:"Gemini",version:"5.1.4",sidebar:{position:"left",display:"post",offset:12,b2t:!1,scrollpercent:!1,onmobile:!1},fancybox:!0,tabs:!0,motion:{enable:!0,async:!1,transition:{post_block:"fadeIn",post_header:"slideDownIn",post_body:"slideDownIn",coll_header:"slideLeftIn",sidebar:"slideUpIn"}},duoshuo:{userId:"0",author:"博主"},algolia:{applicationID:"",apiKey:"",indexName:"",hits:{per_page:10},labels:{input_placeholder:"Search for Posts",hits_empty:"We didn't find any results for the search: ${query}",hits_stats:"${hits} results found in ${time} ms"}}}</script><link rel="canonical" href="https://nc2era.com/76b41bca.html"><title>【从入门到放弃-PHP】foreach 引用的坑 | 从入门到放弃</title><script type="text/javascript">var _hmt=_hmt||[];!function(){var e=document.createElement("script");e.src="https://hm.baidu.com/hm.js?7f0f37da8af427b455867492ca709c92";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)}()</script></head><body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans"><div class="container sidebar-position-left page-post-detail"><div class="headband"></div><header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader"><div class="header-inner"><div class="site-brand-wrapper"><div class="site-meta"><div class="custom-logo-site-title"><a href="/" class="brand" rel="start"><span class="logo-line-before"><i></i></span> <span class="site-title">从入门到放弃</span><span class="logo-line-after"><i></i></span></a></div><h1 class="site-subtitle" itemprop="description">从入门到放弃-程序员进阶之路</h1></div><div class="site-nav-toggle"> <button><span class="btn-bar"></span><span class="btn-bar"></span><span class="btn-bar"></span></button></div></div><nav class="site-nav"><ul id="menu" class="menu"><li class="menu-item menu-item-home"><a href="/" rel="section"><i class="menu-item-icon fa fa-fw fa-home"></i><br> 首页</a></li><li class="menu-item menu-item-tags"><a href="/tags/" rel="section"><i class="menu-item-icon fa fa-fw fa-tags"></i><br> 标签</a></li><li class="menu-item menu-item-categories"><a href="/categories/" rel="section"><i class="menu-item-icon fa fa-fw fa-th"></i><br> 分类</a></li><li class="menu-item menu-item-archives"><a href="/archives/" rel="section"><i class="menu-item-icon fa fa-fw fa-archive"></i><br> 归档</a></li><li class="menu-item menu-item-search"><a href="javascript:;" class="popup-trigger"><i class="menu-item-icon fa fa-search fa-fw"></i><br> 搜索</a></li></ul><div class="site-search"><div class="popup search-popup local-search-popup"><div class="local-search-header clearfix"><span class="search-icon"><i class="fa fa-search"></i></span><span class="popup-btn-close"><i class="fa fa-times-circle"></i></span><div class="local-search-input-wrapper"> <input autocomplete="off" placeholder="搜索..." spellcheck="false" type="text" id="local-search-input"></div></div><div id="local-search-result"></div></div></div></nav></div></header><main id="main" class="main"><div class="main-inner"><div class="content-wrap"><div id="content" class="content"><div id="posts" class="posts-expand"><article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"><div class="post-block"><link itemprop="mainEntityOfPage" href="https://nc2era.com/76b41bca.html"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="AloofJr"><meta itemprop="description" content><meta itemprop="image" content="/images/avatar.gif"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="从入门到放弃"></span><header class="post-header"><h2 class="post-title" itemprop="name headline">【从入门到放弃-PHP】foreach 引用的坑</h2><div class="post-meta"><span class="post-time"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i></span> <span class="post-meta-item-text">发表于</span> <time title="创建于" itemprop="dateCreated datePublished" datetime="2019-05-26T13:18:44+08:00">2019-05-26</time></span> <span class="post-category"><span class="post-meta-divider">|</span><span class="post-meta-item-icon"><i class="fa fa-folder-o"></i></span> <span class="post-meta-item-text">分类于</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/个人学习/" itemprop="url" rel="index"><span itemprop="name">个人学习</span></a></span></span> <span class="post-comments-count"><span class="post-meta-divider">|</span><span class="post-meta-item-icon"><i class="fa fa-comment-o"></i></span><a href="/76b41bca.html#comments" itemprop="discussionUrl"><span class="post-comments-count valine-comment-count" data-xid="/76b41bca.html" itemprop="commentCount"></span></a></span> <span class="post-meta-divider">|</span><span class="page-pv"><i class="fa fa-file-o"></i> 浏览<span class="busuanzi-value" id="busuanzi_value_page_pv"></span></span><div class="post-wordcount"><span class="post-meta-item-icon"><i class="fa fa-file-word-o"></i></span> <span class="post-meta-item-text">字数统计:</span> <span title="字数统计">1.7k</span> <span class="post-meta-divider">|</span><span class="post-meta-item-icon"><i class="fa fa-clock-o"></i></span> <span class="post-meta-item-text">阅读时长 ≈</span> <span title="阅读时长">7</span></div></div></header><div class="post-body" itemprop="articleBody"><h2 id="背景描述"><a href="#背景描述" class="headerlink" title="背景描述"></a>背景描述</h2><p>先看一段代码。<br></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><?php</span></span><br><span class="line"><span class="comment">/*$arr = [</span></span><br><span class="line"><span class="comment"> 'jack' => '20',</span></span><br><span class="line"><span class="comment"> 'tom' => '21',</span></span><br><span class="line"><span class="comment"> 'marry' => '54',</span></span><br><span class="line"><span class="comment"> 'less' => '23'</span></span><br><span class="line"><span class="comment">];</span></span><br><span class="line"><span class="comment">$b = &$arr['jack'];</span></span><br><span class="line"><span class="comment">$a = $arr;</span></span><br><span class="line"><span class="comment">$b = 30;</span></span><br><span class="line"><span class="comment">var_dump($a);</span></span><br><span class="line"><span class="comment">$str = '20';</span></span><br><span class="line"><span class="comment">$c = &$str;</span></span><br><span class="line"><span class="comment">$d = $str;</span></span><br><span class="line"><span class="comment">$c = 30;</span></span><br><span class="line"><span class="comment">var_dump($d);*/</span></span><br><span class="line">$arr = [</span><br><span class="line"> <span class="string">'jack'</span> => <span class="string">'20'</span>,</span><br><span class="line"> <span class="string">'tom'</span> => <span class="string">'21'</span>,</span><br><span class="line"> <span class="string">'marry'</span> => <span class="string">'54'</span>,</span><br><span class="line"> <span class="string">'less'</span> => <span class="string">'23'</span></span><br><span class="line">];</span><br><span class="line"><span class="keyword">foreach</span> ($arr <span class="keyword">as</span> &$val) {</span><br><span class="line"> <span class="keyword">echo</span> $val;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">foreach</span> ($arr <span class="keyword">as</span> $val) {</span><br><span class="line"> <span class="keyword">echo</span> $val;</span><br><span class="line">}</span><br><span class="line">print_r($arr);</span><br></pre></td></tr></table></figure><p></p><p>想一下应该输出什么呢?</p><p>运行一下脚本,真实结果和你想的是否一致呢?</p> <img src="/76b41bca/1.png"><p>在foreach中使用了引用后再次foreach发现$arr[‘less’]的值变成了54,常规理解应该是23才对。</p><p>猜测可能是因为使用引用导致该值变为54 但本着知其然更要知其所以然 我们一起追一下php源码 是什么原因导致的</p><h2 id="环境准备"><a href="#环境准备" class="headerlink" title="环境准备"></a>环境准备</h2><p>工欲善其事必先利其器,先下载调试工具及源码</p><h3 id="下载Visual-Studio-2017,并安装"><a href="#下载Visual-Studio-2017,并安装" class="headerlink" title="下载Visual Studio 2017,并安装"></a>下载Visual Studio 2017,并安装</h3><p>下载地址:<a href="https://www.visualstudio.com/zh-hans/downloads/" rel="external nofollow noopener noreferrer" target="_blank">https://www.visualstudio.com/zh-hans/downloads/</a></p><h3 id="下载php源码"><a href="#下载php源码" class="headerlink" title="下载php源码"></a>下载php源码</h3><p><a href="http://cn2.php.net/distributions/php-7.0.27.tar.bz2" rel="external nofollow noopener noreferrer" target="_blank">http://cn2.php.net/distributions/php-7.0.27.tar.bz2</a></p><h3 id="从文件夹创建解决方案"><a href="#从文件夹创建解决方案" class="headerlink" title="从文件夹创建解决方案"></a>从文件夹创建解决方案</h3><p>创建成功后如下图所示</p> <img src="/76b41bca/2.png"><h2 id="源码追踪"><a href="#源码追踪" class="headerlink" title="源码追踪"></a>源码追踪</h2><h3 id="先搜索关键字foreach"><a href="#先搜索关键字foreach" class="headerlink" title="先搜索关键字foreach"></a>先搜索关键字foreach</h3><img src="/76b41bca/3.png"><p>可以在zend_language_parser.c 中看到, 语法解析时 foreach会当做T_FOREACH</p> <img src="/76b41bca/4.png"><p>在zend_language_parser.y可以看到语法解析的具体方式</p> <img src="/76b41bca/5.png"><p>ZEND_AST_FOREACH</p> <img src="/76b41bca/6.png"><p>查找zend_ast_create</p> <img src="/76b41bca/7.png"><p>zend_ast.c中:</p> <img src="/76b41bca/8.png"><p>zend_ast_create 函数是创建一个抽象语法树(abstract syntax tree)返回的zend_ast结构如下:</p> <img src="/76b41bca/9.png"><p>具体的赋值操作如下:</p> <img src="/76b41bca/10.png"><p>接下来在zend_compile.c中根据抽象语法树生成opcode:</p> <img src="/76b41bca/11.png"><p>通过上图及语法解析的分析可知,foreach在编译阶段会生成如上图的四个zend_ast节点,分别表示:要遍历的数组或对象expr_ast,要遍历的value value_ast,要遍历的key key_ast,循环体stmt_ast<br>如:</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$arr = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>];</span><br><span class="line"></span><br><span class="line"><span class="keyword">foreach</span> ($arr <span class="keyword">as</span> $key => $val) {</span><br><span class="line"> <span class="keyword">echo</span> $val;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>expr_ast 是可理解为是$arr编译时对应的ast结构</p><p>value_ast对应$val</p><p>key_ast对应$key</p><p>stmt_ast对应”echo $val;”</p> <img src="/76b41bca/12.png"><p>copy一份要遍历的数组或对象,如果是引用则把原数组或对象设为引用类型<br>如:<br></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">foreach</span> ($arr <span class="keyword">as</span> $k => $v) {</span><br><span class="line"> <span class="keyword">echo</span> $v;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p></p><p>copy一份$arr用于遍历,从arData的首元素起,把bucket.zval.value赋值给$v,把bucket.h或key赋值给$k,然后将下一个元素的位置记录在zval.u2.fe_iter_idx中,下次遍历从该位置开始</p><p>当u2.fe_iter_idex到了arData的末尾则遍历结束并销毁copy的$arr副本</p> <img src="/76b41bca/13.png"><p>如果$v是引用 则在循环前,将原$arr设置为引用类型 即:<br></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">foreach</span> ($arr <span class="keyword">as</span> $k => &$v) {</span><br><span class="line"> <span class="keyword">echo</span> $v;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p></p> <img src="/76b41bca/14.png"> <img src="/76b41bca/15.png"><ul><li>编译copy的数组、对象操作的指令:增加一条opcode指令 ZEND_FE_RESET_R(如果value是引用则用ZEND_FE_RESET_RW) 。执行时如果发现遍历的不是数组、对象 则抛出一个warning,然后跳出循环。</li><li>编译fetch数组、对象当前单元key 、value的opcode : ZEND_FE_FETCH_R(如果value是引用则用ZEND_FE_FETCH_RW)。此opcode需要知道当遍历到达数组末尾时跳出遍历的位置。此外还会对key和value分配他们在内存中的位置,如果value不是一CV个变量,还会编译其它操作的opcode</li><li>如果定义了key,则会编译一条opcode,对key进行赋值</li><li>编译循环体statement</li><li>编译跳回遍历开始时的opcode,一次遍历结束后跳到步骤2编译的opcode进行下次遍历</li><li>设置步骤1、2两条opcode如果出错要跳到的opcode</li><li>结束循环 编译ZEND_FE_FREE用于释放1中copy的数组或对象<h2 id="结论分析"><a href="#结论分析" class="headerlink" title="结论分析"></a>结论分析</h2>编译后的结构:</li></ul> <img src="/76b41bca/16.png"><p>运行时步骤:</p><ul><li>(1) 执行ZEND_FE_RESET_R,过程上面已经介绍了;</li><li>(2) 执行ZEND_FE_FETCH_R,此opcode的操作主要有三个:检查遍历位置是否到达末尾、将数组元素的value赋值给$value、将数组元素的key赋值给一个临时变量(注意与value不同);</li><li>(3) 如果定义了key则执行ZEND_ASSIGN,将key的值从临时变量赋值给$key,否则跳到步骤(4);</li><li>(4) 执行循环体的statement;</li><li>(5) 执行ZEND_JMPNZ跳回步骤(2);</li><li>(6) 遍历结束后执行ZEND_FE_FREE释放数组。</li></ul><p>因此根据上面的分析:赋值的核心操作是ZEND_FE_FETCH_RW</p><p>上面的例子可等价于<br></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">$arr = [</span><br><span class="line"> <span class="string">'jack'</span> => <span class="string">'20'</span>,</span><br><span class="line"> <span class="string">'tom'</span> => <span class="string">'21'</span>,</span><br><span class="line"> <span class="string">'marry'</span> => <span class="string">'54'</span>,</span><br><span class="line"> <span class="string">'less'</span> => <span class="string">'23'</span></span><br><span class="line">];</span><br><span class="line">$val = &$arr[<span class="string">'jack'</span>];</span><br><span class="line">$val = &$arr[<span class="string">'tom'</span>];</span><br><span class="line">$val = &$arr[<span class="string">'marry'</span>];</span><br><span class="line">$val = &$arr[<span class="string">'less'</span>];</span><br><span class="line">$val = $arr[<span class="string">'jack'</span>];</span><br><span class="line">$val = $arr[<span class="string">'tom'</span>];</span><br><span class="line">$val = $arr[<span class="string">'marry'</span>];</span><br><span class="line">$val = $arr[<span class="string">'less'</span>];</span><br><span class="line">print_r($arr);</span><br></pre></td></tr></table></figure><p></p><p>等价于:<br></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">$arr = [</span><br><span class="line"> <span class="string">'jack'</span> => <span class="string">'20'</span>,</span><br><span class="line"> <span class="string">'tom'</span> => <span class="string">'21'</span>,</span><br><span class="line"> <span class="string">'marry'</span> => <span class="string">'54'</span>,</span><br><span class="line"> <span class="string">'less'</span> => <span class="string">'23'</span></span><br><span class="line">];</span><br><span class="line">$val = &$arr[<span class="string">'less'</span>]; (<span class="number">23</span>)</span><br><span class="line">$val = $arr[<span class="string">'marry'</span>]; (<span class="number">54</span>,并且此时因为引用 $arr[<span class="string">'less'</span>]也变为<span class="number">54</span>了)</span><br><span class="line">$val = $arr[<span class="string">'less'</span>]; (<span class="number">54</span>)</span><br><span class="line">print_r($arr);</span><br></pre></td></tr></table></figure><p></p> <img src="/76b41bca/17.png"><p>因此 为了避免出现不必要的错误,建议在使用完&后,unset掉变量以取消对地址的引用</p><h3 id="思维发散:"><a href="#思维发散:" class="headerlink" title="思维发散:"></a>思维发散:</h3><p>针对以上情况,如果不取消对变量的引用,而是将数组赋值给一个新的变量再foreach。是否可行?</p><p>先看一段代码:<br></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><?php</span></span><br><span class="line">$str = <span class="string">'20'</span>;</span><br><span class="line">$c = &$str;</span><br><span class="line">$a = $str;</span><br><span class="line">$c = <span class="number">30</span>;</span><br><span class="line">var_dump($a);</span><br></pre></td></tr></table></figure><p></p> <img src="/76b41bca/18.png"><p>输出20 没有任何问题<br>如果换成数组:<br></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><?php</span></span><br><span class="line">$arr = [</span><br><span class="line"> <span class="string">'jack'</span> => <span class="string">'20'</span>,</span><br><span class="line"> <span class="string">'tom'</span> => <span class="string">'21'</span>,</span><br><span class="line"> <span class="string">'marry'</span> => <span class="string">'54'</span>,</span><br><span class="line"> <span class="string">'less'</span> => <span class="string">'23'</span></span><br><span class="line">];</span><br><span class="line">$b = &$arr;</span><br><span class="line">$a = $arr;</span><br><span class="line">$b[<span class="string">'jack'</span>] = <span class="number">30</span>;</span><br><span class="line">var_dump($a);</span><br></pre></td></tr></table></figure><p></p> <img src="/76b41bca/19.png"><p>还是20 符合预期<br>但如果这样呢:<br></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><?php</span></span><br><span class="line">$arr = [</span><br><span class="line"> <span class="string">'jack'</span> => <span class="string">'20'</span>,</span><br><span class="line"> <span class="string">'tom'</span> => <span class="string">'21'</span>,</span><br><span class="line"> <span class="string">'marry'</span> => <span class="string">'54'</span>,</span><br><span class="line"> <span class="string">'less'</span> => <span class="string">'23'</span></span><br><span class="line">];</span><br><span class="line">$b = &$arr[<span class="string">'jack'</span>];</span><br><span class="line">$a = $arr;</span><br><span class="line">$b = <span class="number">30</span>;</span><br><span class="line">var_dump($a)</span><br></pre></td></tr></table></figure><p></p> <img src="/76b41bca/20.png"><p>值却变成了30<br>我们加上xdebug_debug_zval看看发生了什么<br></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><?php</span></span><br><span class="line">$arr = [</span><br><span class="line"> <span class="string">'jack'</span> => <span class="string">'20'</span>,</span><br><span class="line"> <span class="string">'tom'</span> => <span class="string">'21'</span>,</span><br><span class="line"> <span class="string">'marry'</span> => <span class="string">'54'</span>,</span><br><span class="line"> <span class="string">'less'</span> => <span class="string">'23'</span></span><br><span class="line">];</span><br><span class="line">$b = &$arr;</span><br><span class="line">$a = $arr;</span><br><span class="line">$b[<span class="string">'jack'</span>] = <span class="number">30</span>;</span><br><span class="line">var_dump($a);</span><br><span class="line">xdebug_debug_zval(<span class="string">'a'</span>);</span><br><span class="line">xdebug_debug_zval(<span class="string">'arr'</span>);</span><br></pre></td></tr></table></figure><p></p> <img src="/76b41bca/21.png"><p>可以看出,直接引用数组, $b = &$arr, $arr 的is_ref是1,refcount是2, 给$a = $arr时,发生分离,$a 与$arr指向不同的zval,$b 与 $arr指向相同的zval,因此给$b[‘jack’] = 30, $a的值不会发生改变<br></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><?php</span></span><br><span class="line">$arr = [</span><br><span class="line"> <span class="string">'jack'</span> => <span class="string">'20'</span>,</span><br><span class="line"> <span class="string">'tom'</span> => <span class="string">'21'</span>,</span><br><span class="line"> <span class="string">'marry'</span> => <span class="string">'54'</span>,</span><br><span class="line"> <span class="string">'less'</span> => <span class="string">'23'</span></span><br><span class="line">];</span><br><span class="line">$b = &$arr[<span class="string">'jack'</span>];</span><br><span class="line">$a = $arr;</span><br><span class="line">$b = <span class="number">30</span>;</span><br><span class="line">var_dump($a);</span><br><span class="line">xdebug_debug_zval(<span class="string">'a'</span>);</span><br><span class="line">xdebug_debug_zval(<span class="string">'arr'</span>)</span><br></pre></td></tr></table></figure><p></p> <img src="/76b41bca/22.png"><p>可以看出,对数组中一个元素引用时,数组的is_ref是0,因为$a = $arr 因此refcount是2 ,指向同一个zval,改变$b的值时,因为$arr[‘jack’]是一个引用,zval的值改变,$a和$arr的zval相同,$a[‘jack’]也变为30<br>同理可以回答最开始提出的疑问:如果我不取消对变量的引用,而是将数组赋值给一个新的变量再foreach。是否可行?答:不行。<br></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><?php</span></span><br><span class="line">$arr = [</span><br><span class="line"> <span class="string">'jack'</span> => <span class="string">'20'</span>,</span><br><span class="line"> <span class="string">'tom'</span> => <span class="string">'21'</span>,</span><br><span class="line"> <span class="string">'marry'</span> => <span class="string">'54'</span>,</span><br><span class="line"> <span class="string">'less'</span> => <span class="string">'23'</span></span><br><span class="line">];</span><br><span class="line"><span class="keyword">foreach</span> ($arr <span class="keyword">as</span> &$val) {</span><br><span class="line"> <span class="keyword">echo</span> $val;</span><br><span class="line">}</span><br><span class="line">$a = $arr;</span><br><span class="line"><span class="keyword">foreach</span> ($a <span class="keyword">as</span> $val) {</span><br><span class="line"> <span class="keyword">echo</span> $val;</span><br><span class="line">}</span><br><span class="line">print_r($a);</span><br></pre></td></tr></table></figure><p></p> <img src="/76b41bca/23.png"><p>因为$arr与$a指向同一份zval,还是会出现$a[‘less’] = 54的结果。因此,在foreach使用完&后,还是unset掉变量 取消对地址的引用再进行下一步操作吧</p><p>参考文献:<br><a href="https://github.com/pangudashu/php7-internal/blob/master/4/loop.md" rel="external nofollow noopener noreferrer" target="_blank">https://github.com/pangudashu/php7-internal/blob/master/4/loop.md</a></p></div><footer class="post-footer"><div class="post-tags"> <a href="/tags/C/" rel="tag"># C++</a> <a href="/tags/PHP/" rel="tag"># PHP</a></div><div class="post-nav"><div class="post-nav-next post-nav-item"><a href="/6e2383f1.html" rel="next" title="【从入门到放弃-MySQL】mysql 数据恢复实战&踩坑记录"><i class="fa fa-chevron-left"></i> 【从入门到放弃-MySQL】mysql 数据恢复实战&踩坑记录</a></div><span class="post-nav-divider"></span><div class="post-nav-prev post-nav-item"> <a href="/76483f54.html" rel="prev" title="【从入门到放弃-Hadoop】Hadoop基础学习">【从入门到放弃-Hadoop】Hadoop基础学习<i class="fa fa-chevron-right"></i></a></div></div></footer></div></article><div class="post-spread"></div></div></div><div class="comments" id="comments"></div></div><div class="sidebar-toggle"><div class="sidebar-toggle-line-wrap"><span class="sidebar-toggle-line sidebar-toggle-line-first"></span><span class="sidebar-toggle-line sidebar-toggle-line-middle"></span><span class="sidebar-toggle-line sidebar-toggle-line-last"></span></div></div><aside id="sidebar" class="sidebar"><div class="sidebar-inner"><ul class="sidebar-nav motion-element"><li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap"> 文章目录</li><li class="sidebar-nav-overview" data-target="site-overview-wrap"> 站点概览</li></ul><section class="site-overview-wrap sidebar-panel"><div class="site-overview"><div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person"><p class="site-author-name" itemprop="name">AloofJr</p><p class="site-description motion-element" itemprop="description"></p></div><nav class="site-state motion-element"><div class="site-state-item site-state-posts"> <a href="/archives/"><span class="site-state-item-count">47</span> <span class="site-state-item-name">日志</span></a></div><div class="site-state-item site-state-categories"> <a href="/categories/index.html"><span class="site-state-item-count">1</span> <span class="site-state-item-name">分类</span></a></div><div class="site-state-item site-state-tags"> <a href="/tags/index.html"><span class="site-state-item-count">50</span> <span class="site-state-item-name">标签</span></a></div></nav><div class="feed-link motion-element"><a href="/atom.xml" rel="alternate"><i class="fa fa-rss"></i> RSS</a></div><div class="links-of-author motion-element"><span class="links-of-author-item"><a href="https://github.com/AloofJr" target="_blank" title="GitHub" rel="external nofollow noopener noreferrer"><i class="fa fa-fw fa-github"></i> GitHub</a></span></div></div></section><section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active"><div class="post-toc"><div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#背景描述"><span class="nav-number">1.</span> <span class="nav-text">背景描述</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#环境准备"><span class="nav-number">2.</span> <span class="nav-text">环境准备</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#下载Visual-Studio-2017,并安装"><span class="nav-number">2.1.</span> <span class="nav-text">下载Visual Studio 2017,并安装</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#下载php源码"><span class="nav-number">2.2.</span> <span class="nav-text">下载php源码</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#从文件夹创建解决方案"><span class="nav-number">2.3.</span> <span class="nav-text">从文件夹创建解决方案</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#源码追踪"><span class="nav-number">3.</span> <span class="nav-text">源码追踪</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#先搜索关键字foreach"><span class="nav-number">3.1.</span> <span class="nav-text">先搜索关键字foreach</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#结论分析"><span class="nav-number">4.</span> <span class="nav-text">结论分析</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#思维发散:"><span class="nav-number">4.1.</span> <span class="nav-text">思维发散:</span></a></li></ol></li></ol></div></div></section></div></aside></div></main><footer id="footer" class="footer"><div class="footer-inner"><div class="copyright">© <span itemprop="copyrightYear">2020</span><span class="with-love"><i class="fa fa-user"></i></span> <span class="author" itemprop="copyrightHolder">AloofJr</span> <span class="post-meta-divider">|</span><span class="post-meta-item-icon"><i class="fa fa-area-chart"></i></span> <span class="post-meta-item-text">Site words total count:</span> <span title="Site words total count">79.4k</span></div><script>!function(){var t=document.createElement("script"),e=window.location.protocol.split(":")[0];t.src="https"===e?"https://zz.bdstatic.com/linksubmit/push.js":"http://push.zhanzhang.baidu.com/push.js";var s=document.getElementsByTagName("script")[0];s.parentNode.insertBefore(t,s)}()</script><div class="busuanzi-count"><script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script><span class="site-uv"><i class="fa fa-user"></i><span class="busuanzi-value" id="busuanzi_value_site_uv"></span></span><span class="site-pv"><i class="fa fa-eye"></i><span class="busuanzi-value" id="busuanzi_value_site_pv"></span></span></div></div></footer><div class="back-to-top"><i class="fa fa-arrow-up"></i></div></div><script type="text/javascript">"[object Function]"!==Object.prototype.toString.call(window.Promise)&&(window.Promise=null)</script><script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script><script type="text/javascript" src="/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script><script type="text/javascript" src="/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script><script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script><script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script><script type="text/javascript" src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script><script type="text/javascript" src="/js/src/utils.js?v=5.1.4"></script><script type="text/javascript" src="/js/src/motion.js?v=5.1.4"></script><script type="text/javascript" src="/js/src/affix.js?v=5.1.4"></script><script type="text/javascript" src="/js/src/schemes/pisces.js?v=5.1.4"></script><script type="text/javascript" src="/js/src/scrollspy.js?v=5.1.4"></script><script type="text/javascript" src="/js/src/post-details.js?v=5.1.4"></script><script type="text/javascript" src="/js/src/bootstrap.js?v=5.1.4"></script><script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script><script src="//unpkg.com/valine/dist/Valine.min.js"></script><script type="text/javascript">
var GUEST = ['nick','mail','link'];
var guest = 'nick,mail';
guest = guest.split(',').filter(item=>{
return GUEST.indexOf(item)>-1;
});
new Valine({
el: '#comments' ,
verify: true,
notify: true,
appId: 'AtTFeTEomwo5ADIQTR8YFRcL-gzGzoHsz',
appKey: 'vKO8qLF0TzyALMhWTxgQ7GPh',
placeholder: '欢迎各路大神交流指正!',
avatar:'mm',
guest_info:guest,
pageSize:'10' || 10,
});
</script><script type="text/javascript">
// Popup Window;
var isfetched = false;
var isXml = true;
// Search DB path;
var search_path = "search.xml";
if (search_path.length === 0) {
search_path = "search.xml";
} else if (/json$/i.test(search_path)) {
isXml = false;
}
var path = "/" + search_path;
// monitor main search box;
var onPopupClose = function (e) {
$('.popup').hide();
$('#local-search-input').val('');
$('.search-result-list').remove();
$('#no-result').remove();
$(".local-search-pop-overlay").remove();
$('body').css('overflow', '');
}
function proceedsearch() {
$("body")
.append('<div class="search-popup-overlay local-search-pop-overlay"></div>')
.css('overflow', 'hidden');
$('.search-popup-overlay').click(onPopupClose);
$('.popup').toggle();
var $localSearchInput = $('#local-search-input');
$localSearchInput.attr("autocapitalize", "none");
$localSearchInput.attr("autocorrect", "off");
$localSearchInput.focus();
}
// search function;
var searchFunc = function(path, search_id, content_id) {
'use strict';
// start loading animation
$("body")
.append('<div class="search-popup-overlay local-search-pop-overlay">' +
'<div id="search-loading-icon">' +
'<i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>' +
'</div>' +
'</div>')
.css('overflow', 'hidden');
$("#search-loading-icon").css('margin', '20% auto 0 auto').css('text-align', 'center');
$.ajax({
url: path,
dataType: isXml ? "xml" : "json",
async: true,
success: function(res) {
// get the contents from search data
isfetched = true;
$('.popup').detach().appendTo('.header-inner');
var datas = isXml ? $("entry", res).map(function() {
return {
title: $("title", this).text(),
content: $("content",this).text(),
url: $("url" , this).text()
};
}).get() : res;
var input = document.getElementById(search_id);
var resultContent = document.getElementById(content_id);
var inputEventFunction = function() {
var searchText = input.value.trim().toLowerCase();
var keywords = searchText.split(/[\s\-]+/);
if (keywords.length > 1) {
keywords.push(searchText);
}
var resultItems = [];
if (searchText.length > 0) {
// perform local searching
datas.forEach(function(data) {
var isMatch = false;
var hitCount = 0;
var searchTextCount = 0;
var title = data.title.trim();
var titleInLowerCase = title.toLowerCase();
var content = data.content.trim().replace(/<[^>]+>/g,"");
var contentInLowerCase = content.toLowerCase();
var articleUrl = decodeURIComponent(data.url);
var indexOfTitle = [];
var indexOfContent = [];
// only match articles with not empty titles
if(title != '') {
keywords.forEach(function(keyword) {
function getIndexByWord(word, text, caseSensitive) {
var wordLen = word.length;
if (wordLen === 0) {
return [];
}
var startPosition = 0, position = [], index = [];
if (!caseSensitive) {
text = text.toLowerCase();
word = word.toLowerCase();
}
while ((position = text.indexOf(word, startPosition)) > -1) {
index.push({position: position, word: word});
startPosition = position + wordLen;
}
return index;
}
indexOfTitle = indexOfTitle.concat(getIndexByWord(keyword, titleInLowerCase, false));
indexOfContent = indexOfContent.concat(getIndexByWord(keyword, contentInLowerCase, false));
});
if (indexOfTitle.length > 0 || indexOfContent.length > 0) {
isMatch = true;
hitCount = indexOfTitle.length + indexOfContent.length;
}
}
// show search results
if (isMatch) {
// sort index by position of keyword
[indexOfTitle, indexOfContent].forEach(function (index) {
index.sort(function (itemLeft, itemRight) {
if (itemRight.position !== itemLeft.position) {
return itemRight.position - itemLeft.position;
} else {
return itemLeft.word.length - itemRight.word.length;
}
});
});
// merge hits into slices
function mergeIntoSlice(text, start, end, index) {
var item = index[index.length - 1];
var position = item.position;
var word = item.word;
var hits = [];
var searchTextCountInSlice = 0;
while (position + word.length <= end && index.length != 0) {
if (word === searchText) {
searchTextCountInSlice++;
}
hits.push({position: position, length: word.length});
var wordEnd = position + word.length;
// move to next position of hit
index.pop();
while (index.length != 0) {
item = index[index.length - 1];
position = item.position;
word = item.word;
if (wordEnd > position) {
index.pop();
} else {
break;
}
}
}
searchTextCount += searchTextCountInSlice;
return {
hits: hits,
start: start,
end: end,
searchTextCount: searchTextCountInSlice
};
}
var slicesOfTitle = [];
if (indexOfTitle.length != 0) {
slicesOfTitle.push(mergeIntoSlice(title, 0, title.length, indexOfTitle));
}
var slicesOfContent = [];
while (indexOfContent.length != 0) {
var item = indexOfContent[indexOfContent.length - 1];
var position = item.position;
var word = item.word;
// cut out 100 characters
var start = position - 20;
var end = position + 80;
if(start < 0){
start = 0;
}
if (end < position + word.length) {
end = position + word.length;
}
if(end > content.length){
end = content.length;
}
slicesOfContent.push(mergeIntoSlice(content, start, end, indexOfContent));
}
// sort slices in content by search text's count and hits' count
slicesOfContent.sort(function (sliceLeft, sliceRight) {
if (sliceLeft.searchTextCount !== sliceRight.searchTextCount) {
return sliceRight.searchTextCount - sliceLeft.searchTextCount;
} else if (sliceLeft.hits.length !== sliceRight.hits.length) {
return sliceRight.hits.length - sliceLeft.hits.length;
} else {
return sliceLeft.start - sliceRight.start;
}
});
// select top N slices in content
var upperBound = parseInt('1');
if (upperBound >= 0) {
slicesOfContent = slicesOfContent.slice(0, upperBound);
}
// highlight title and content
function highlightKeyword(text, slice) {
var result = '';
var prevEnd = slice.start;
slice.hits.forEach(function (hit) {
result += text.substring(prevEnd, hit.position);
var end = hit.position + hit.length;
result += '<b class="search-keyword">' + text.substring(hit.position, end) + '</b>';
prevEnd = end;
});
result += text.substring(prevEnd, slice.end);
return result;
}
var resultItem = '';
if (slicesOfTitle.length != 0) {
resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + highlightKeyword(title, slicesOfTitle[0]) + "</a>";
} else {
resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + title + "</a>";
}
slicesOfContent.forEach(function (slice) {
resultItem += "<a href='" + articleUrl + "'>" +
"<p class=\"search-result\">" + highlightKeyword(content, slice) +
"...</p>" + "</a>";
});
resultItem += "</li>";
resultItems.push({
item: resultItem,
searchTextCount: searchTextCount,
hitCount: hitCount,
id: resultItems.length
});
}
})
};
if (keywords.length === 1 && keywords[0] === "") {
resultContent.innerHTML = '<div id="no-result"><i class="fa fa-search fa-5x" /></div>'
} else if (resultItems.length === 0) {
resultContent.innerHTML = '<div id="no-result"><i class="fa fa-frown-o fa-5x" /></div>'
} else {
resultItems.sort(function (resultLeft, resultRight) {
if (resultLeft.searchTextCount !== resultRight.searchTextCount) {
return resultRight.searchTextCount - resultLeft.searchTextCount;
} else if (resultLeft.hitCount !== resultRight.hitCount) {
return resultRight.hitCount - resultLeft.hitCount;
} else {
return resultRight.id - resultLeft.id;
}
});
var searchResultList = '<ul class=\"search-result-list\">';
resultItems.forEach(function (result) {
searchResultList += result.item;
})
searchResultList += "</ul>";
resultContent.innerHTML = searchResultList;
}
}
if ('auto' === 'auto') {
input.addEventListener('input', inputEventFunction);
} else {
$('.search-icon').click(inputEventFunction);
input.addEventListener('keypress', function (event) {
if (event.keyCode === 13) {
inputEventFunction();
}
});
}
// remove loading animation
$(".local-search-pop-overlay").remove();
$('body').css('overflow', '');
proceedsearch();
}
});
}
// handle and trigger popup window;
$('.popup-trigger').click(function(e) {
e.stopPropagation();
if (isfetched === false) {
searchFunc(path, 'local-search-input', 'local-search-result');
} else {
proceedsearch();
};
});
$('.popup-btn-close').click(onPopupClose);
$('.popup').click(function(e){
e.stopPropagation();
});
$(document).on('keyup', function (event) {
var shouldDismissSearchPopup = event.which === 27 &&
$('.search-popup').is(':visible');
if (shouldDismissSearchPopup) {
onPopupClose();
}
});
</script><script>!function(){var t=document.createElement("script"),e=window.location.protocol.split(":")[0];t.src="https"===e?"https://zz.bdstatic.com/linksubmit/push.js":"http://push.zhanzhang.baidu.com/push.js";var s=document.getElementsByTagName("script")[0];s.parentNode.insertBefore(t,s)}()</script></body></html>